home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-01-03 | 162.6 KB | 6,618 lines |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- GAP Communications Online Software
-
-
-
-
- GAPCDR
-
- Door Interface Library
-
-
-
-
-
-
- Copyright (C) 1987-1994 by GAP Development Company.
-
-
- ALL RIGHTS RESERVED. No part of this manual shall be reproduced,
- stored in a retrieval system, or transmitted by any means,
- electronic, mechanical, photocopying, recording, or otherwise,
- without written permission from GAP Development Company. While
- every precaution has been taken in the preparation of this
- manual, GAP Development Company assumes no responsibility for
- errors or omissions. Neither is any liability assumed for damages
- resulting from the use of the information contained herein.
-
-
- GAPCDR is the sole and exclusive property of GAP Development
- Company. It is licensed and not sold to the end user with
- restrictions placed upon its use.
-
-
- GAPCDR is copyrighted by GAP Development Company.
- DESQview is a trademark of Quarterdeck.
- PCBoard is a trademark of Clark Development Corporation.
- WildCat! is copyrighted by Mustang Software.
- DigiBoard is a trademark of DigiBoard Incorporated.
-
-
-
-
-
-
- Contents
-
-
-
- Description 5
-
- Major Features 5
-
-
- Getting Started 7
-
- Supported Compilers 8
- Using GAPCDR 8
- Points To Remember 11
- Compiling And Linking 12
- Using A Goto 13
- BBS System Files 14
-
-
- Sysop Setup And Functions 14
-
- Configuration 15
- Sysop Functions 17
-
-
- Advanced Applications 18
-
- Communications 18
- DOS Window 20
-
-
- Variables 22
-
- Defines 22
- Ansi Variables 22
- DOOR.SYS Variables 23
- Global Variables 25
-
-
- Functions - Quick Reference 27
-
-
-
- Functions - Detailed Reference 28
-
-
-
- Index 104
-
-
-
- Page 3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 4
-
-
-
- GAP Communications GAPCDR
-
-
-
-
- Description
-
-
- GAPCDR is a professional development kit for Bulletin Board Door
- programmers. Written in Microsoft C version 7 and MASM version 6,
- it is fast, reliable, easy to use, and easy to incorporate into
- the serious programmer's source code. It consists of a set of C
- and assembler library routines to allow for easy door programming
- and interfacing. Borland C compatability is included.
-
-
- Major Features
-
- Interfaces with GAP Communications, PCBoard, WildCat, and
- other fine BBS programs that are capable of writing a
- DOOR.SYS file.
-
- Full communications support including the DigiBoard COM/Xi
- series of Intelligent Multi-Port boards as well as Fossil
- Drivers.
-
- Supports the FIFO buffers of the 16550 UART chip.
-
- Speeds up to 115,200 baud.
-
- Communications ports other than Com 1 and Com 2 possible.
-
- Supports CTS/RTS, automatically.
-
- Does not require watchdog or CTTY.
-
- Fully self contained, built in ANSI driver.
-
- Sysop sees what the caller sees.
-
- High speed text file display.
-
- Supports ANSI color and ASCII text files with no
- programming effort other than to make a single function
- call.
-
- Easy to use Random Number Generator.
-
- Informative Status Line display.
-
- Monitors keyboard activity and caller time remaining.
-
-
-
- Page 5
-
-
-
- GAP Communications GAPCDR
-
-
- Easy interface to BBS system.
-
- Sysop chat with full word wrapping.
-
- Allows the sysop to shell to DOS.
-
- "Remembers" the default drive and directory which prevents
- file access errors.
-
- Credits caller with time spent chatting or while sysop is
- in a DOS shell.
-
- Sysop can twit caller without caller ever knowing the sysop
- is watching.
-
- Caller time can be increased or decreased.
-
- Full programmer control of whether or not to update the BBS
- system files.
-
- Time calculations are not dependent on the "seconds since
- midnight" and are thus unsusceptible to the midnight roll
- over.
-
- Timer routines are hardware independent.
-
- Automatic detection of multi-user system.
-
- Input routines are consistent throughout the program.
-
- Uses the latest in Microsoft C and MASM features.
-
- Extremely easy interfacing to door programs.
-
- Fully DESQView aware video routines as well as keyboard and
- COM input routines, and COM output routines.
-
-
-
- GAPCDR includes robust Communications routines which are fully
- interrupt driven. Written in highly optimized assembler, they are
- capable of operating at any speed which the UART on an IBM type
- of computer is capable of producing. The FIFO buffers in the
- 16550 UART are fully supported. CTS/RTS checking is automatic,
- and carrier detect is an integral part of each of the
- communications input and output routines. When there is a loss of
- carrier, a function in the main GAPCDR code will be called. This
-
-
-
-
- Page 6
-
-
-
- GAP Communications GAPCDR
-
-
- function defaults to shutting down the door and returning to the
- BBS, however you may modify it to do whatever you wish.
-
- The built in ANSI driver makes GAPCDR a self contained unit. The
- driver is smart enough to know when a caller does not want ANSI
- sequences sent to his computer and it will filter out any such
- codes that pass through it. This allows you to create prompts
- with embedded ANSI sequences and display them without regard as
- to whether or not the caller has color "turned on". This also
- means you do not have to keep two sets of prompts (one with color
- attributes and one without). This is a great savings to you in
- precious DATA space. You may also use the ANSI driver to send
- color strings to the local monitor. Even if the caller is in mono
- mode, you may still send color strings and prompts to the ANSI
- driver and have them displayed in color on the local monitor.
-
- GAPCDR supports only the DOOR.SYS format for passing caller
- information to a door. We choose this format because of its
- universal acceptance and its inherent ability to remain stable.
- BBS programs frequently change and with those changes usually
- come modifications to the system files they create to interact
- with door programs. DOOR.SYS on the other hand was designed to
- include as much information about a caller as was thought
- necessary. Should new fields be needed to take care of new BBS
- features, it is a simple matter to add these new fields to the
- end of the file, thereby making the new version compatible with
- all prior versions. Most major BBS programs support DOOR.SYS.
-
-
-
- Getting Started
-
-
- GAPCDR is distributed in archived format. The contents of the
- archive should be as follows:
-
- GAPCDR.TXT - Disk based documentation.
- GAPCDRS.LIB - Small model Library routines.
- GAPCDRL.LIB - Large model Library routines.
- GAPCDBS.LIB - Small model Library routines for BC.
- GAPCDBL.LIB - Large model Library routines for BC.
- GAPCDR.H - Door Interface include file.
- GAPSTRUC.H - Door Interface include file.
- CDOOR.ZIP - Sample program illustrating many of the
- features of GAPCDR.
- READ.ME - Any pertinent information which you
- should read.
-
-
-
-
- Page 7
-
-
-
- GAP Communications GAPCDR
-
-
- If you licensed the source code to GAPCDR you will receive most
- of the ASM, C, INC, H, BAT, and OBJ files that make up the GAPCDR
- library. We include both Microsoft and Borland batch files to
- compile the source modules.
-
-
- Supported Compilers
-
- We used the Microsoft C compiler version 8.x, the Borland C++
- Compiler version 4.x, and MASM version 6. The linker and
- librarian were from their respective compilers.
-
- Since GAPCDR uses no floating point math, the C modules were
- compiled with the /FPa switch for Microsoft. This is the default
- for Borland, so no switches are necessary. For Microsoft C, in
- order to use the /FPa switch, you must tell the SETUP program
- that you want to create the Alternate Floating Point library. It
- will then create a set of libraries that make calls to the
- Alternate Math library instead of the Emulator Library. The
- difference in code size for a large model program that uses the
- Alternate library as opposed to the Emulator library is typically
- around 10k. Even if you do not use floating point arithmetic in
- your program, the Math Library will still be linked in because it
- contains the routines to do long arithmetic. So, the smaller the
- library, the smaller your programs!
-
- Place the GAPCDR files in your work directory. You may place the
- LIB files in the MSC\LIB or BORLAND\LIB directory.
-
- The text editor you use must allow control characters to be
- entered and displayed. The ANSI variables are initialized with
- literal characters and if your editor removes the ESC character
- from the strings, your ANSI displays will be quite messy.
-
-
- Using GAPCDR
-
- At the very beginning of your program, you must include the
- GAPCDR.H file. Without this file, nothing will work. It is
- normally included after the C header files that your program may
- need. To include the file, you type the following after including
- the regular C header files:
-
- #include "gapcdr.h"
-
- GAPCDR.H contains the declarations for the external global
- variables. In addition, it includes GAPSTRUC.H which contains the
- structure declarations and the function prototypes.
-
-
-
- Page 8
-
-
-
- GAP Communications GAPCDR
-
-
- Note: Any of your source modules that include GAPCDR.H
- must have an include declaration for STDIO.H prior to
- including GAPCDR.H. It should be standard practice to
- include STDIO.H in your source modules anyway, so this
- shouldn't present any problems.
-
- The first thing that must be done prior to using any of the door
- functions, is to initialize GAPCDR itself. This is accomplished
- by making a call to read_cnf. Read_cnf opens the configuration
- file (the name of which you pass as a parameter on the door
- command line) and reads the first eight lines of the file. If the
- configuration file cannot be found, the program will end. The
- format of the configuration file is as follows:
-
-
-
- c:\gap
- The Crow's Nest
- 0
- 0
- STANDARD
- D000
- 320
- 4
-
-
- The first line of the file is the path to the BBS default
- directory. The second line is the name of the BBS. The third line
- is the Port IRQ and the 4th line is the Port Base Address. If the
- sysop running your program has his BBS configured to use Com
- Ports other than 1 or 2, he would then enter the IRQ and Base
- address for his Com Port on lines 3 and 4. GAPCDR derives the
- Port Number from the DOOR.SYS file.
-
- Lines five through eight are for the Intelligent DigiBoard multi-
- port Communications Card. The DigiBoard routines specifically
- support the COM/Xi series. All four of these lines are required
- even if your end users are using the Standard Interface. Line
- five is the Communications Port Interface. It must be one of the
- following:
-
- STANDARD DIGIBOARD INT14/EBIOS FOSSIL
-
- The Standard interface is the one that will normally be used. If
- an end user is using a DigiBoard then either the DigiBoard or
- Int14/EBIOS interface may be selected. Most sysops will use the
- Int14/EBIOS interface. All input/output to the DigiBoard is
- performed via Interrupt 14 calls and a Device Driver (available
-
-
-
- Page 9
-
-
-
- GAP Communications GAPCDR
-
-
- from DigiBoard) handles the interface between the program and the
- board. The DigiBoard interface uses Direct Programming. GAPCDR
- talks to the board directly without the need for a Device Driver.
- In order to use this interface, a program called RESETDIG.EXE
- must be used in the AUTOEXEC.BAT file to reset the DigiBoard once
- when the computer is first booted. If the end user does not have
- this program (it is a part of the GAP Communications BBS package)
- then the Int14/EBIOS interface must be used.
-
- The Fossil interface is specified when a user is using a Fossil
- Device Driver (either BNU or X00). The Fossil interface also uses
- Interrupt 14 calls that are specific to Fossil drivers.
-
- If the Interface is set to STANDARD or FOSSIL, then lines 6
- through 8 will be ignored. If the Interface is INT14/EBIOS, then
- lines 6 and 7 will be ignored.
-
- Line 6 is the DigiBoard Memory Window, or the address the board
- uses as a communications area between itself and the Host
- Computer. This line is used only if the Interface is set to
- DIGIBOARD. It can be set to 0 if the Interface is STANDARD,
- INT14/EBIOS, or FOSSIL.
-
- Line 7 is the DigiBoard I/O Port Address. This line is used only
- if the Interface is set to DIGIBOARD and can be set to 0
- otherwise.
-
- Line 8 is the DigiBoard Channel Number. This line is required for
- the DIGIBOARD and INT14/EBIOS Interfaces. It is normally 1 - 8
- for the DIGIBOARD Interface and 4 - 11 for the INT14/EBIOS
- Interface. The Channel Number is similar to a Port Number. It
- tells the program which of the DigiBoard Communications ports to
- use.
-
- The configuration file is usually given a name similar to the
- name of your door program, with a CNF extension. Read_cnf will
- leave this file open for your use. If you have any configuration
- options of your own, you may place them in this file beginning
- with line 9. Do not read your configuration options until after
- making a call to init_door (which should be the second function
- call in your program). Upon return from init_door, you are free
- to read your configuration options (if any). At this time, you
- should close the configuration file.
-
- Normally, your program is invoked with a command line parameter
- giving the name of the configuration file to use:
-
- DOOR DOOR.CNF
-
-
-
- Page 10
-
-
-
- GAP Communications GAPCDR
-
-
- You would use the argv parameter to your main function to extract
- the configuration parameter and then pass this parameter on to
- read_cnf. This allows the end user to use a single program (your
- program) with multiple configuration files. This is especially
- important under multi-user systems where separate configuration
- files are needed.
-
- The configuration file is opened as a stream, so using fgets or
- any of the stream input functions would be appropriate for
- reading the data. Remember that the file pointer is passed back
- to you after the call to read_cnf. An example of the first few
- "door" statements that might appear in a source file would be:
-
- FILE *cnf_file; // pointer to config file
-
- cnf_file = read_cnf(argv[1]); // read the cnf file
- init_door(); // init the door
- fclose(cnf_file); // close the cnf file
-
-
- If there were no errors, read_cnf will return. You must now make
- a call to init_door. Init_door uses the information derived from
- line 1 of the configuration file to open and read DOOR.SYS. In
- addition, init_door opens the communications port (if a remote
- user is on), initializes some global variables, initializes the
- random number generator, initializes the ANSI driver, and
- installs a Ctrl-Break handler. If there is an error, init_door
- will not return. Instead it will end the program.
-
- That is basically all you have to do to initialize the GAPCDR
- module. When your program ends, you should clean house if
- necessary and call leave. Leave closes the communications port
- and any open files, restores the ISR routines to their original
- state, sends a sign off message to the caller, and then exits to
- DOS. It is of vital importance to exit the door by making a call
- to leave. Failure to do so will leave communication interrupts
- active and the ctrl-break intercept active. The vectors to these
- routines will be left in the interrupt vector table and the
- computer will surely lock up the first time any program is run.
-
-
- Points To Remember
-
- To get the ball rolling, include GAPCDR.H after the C
- header files.
-
- To initialize the door, call read_cnf with the name of your
- program's configuration file. Then call init_door.
-
-
-
- Page 11
-
-
-
- GAP Communications GAPCDR
-
-
- Call leave when your program is finished.
-
- All input and output should be performed through the GAPCDR
- functions. The sample program gives good examples on how to
- accomplish this. If you use the C runtime output routines
- such as printf or cputs, the local screen will be a mess
- because the internal ANSI driver will not know where the
- cursor is.
-
- To determine if the BBS is a single or multi user system,
- check the variable called multi. If it is anything other
- than 0, then the BBS is multi-user and you should
- read/write your data files with sharing attributes.
-
- Do not use any of the BBS specific functions such as
- read_pcbsys or read_gapuser unless you know that your
- program is running with the appropriate BBS system. You may
- want to use a flag in your configuration file to determine
- which system your program is running with. These functions
- were provided to make your programming choores easier but
- using them basically restricts your door to the respective
- BBS system that the functions interact with.
-
- To test your program, you will need a DOOR.SYS file that
- was written for local exit. Of course, you can always
- modify any DOOR.SYS file and change the first line so that
- it reads COM0:. A complete set of sample files are provided
- for testing your program under local mode.
-
-
- Compiling And Linking
-
- GAPCDR has already been compiled with the necessary compile time
- switches for both Microsoft C and Borland C.
-
- To compile your programs, use whatever switches are required for
- your compiler.
-
- Microsoft C
-
- cl /c /FPa door.c
- link door,,NUL.MAP,+GAPCDRx
-
- Borland C
-
- bcc -c door.c
- tlink c0x+door,door.exe,NUL.MAP,+GAPCDRBx+Cx
-
-
-
-
- Page 12
-
-
-
- GAP Communications GAPCDR
-
-
- Where door is the name of your program and 'x' is 'S' for the
- small model library or 'L' for the large model library.
-
- As was mentioned previously, GAPCDR was compiled with the /FPa
- option for Microsoft C. The /FPa option produces smaller
- executable files.
-
- If you licensed the source code to GAPCDR, there are suplementary
- files to aid in re-compiling and librarying the source modules.
-
- GAPCDR will only compile with Microsoft C version 7 or greater
- and Borland C version 4 or greater.
-
- GAPCDR uses the PASCAL function calling convention. If you are
- unfamiliar with this calling convention it means that the
- parameters to a function are pushed onto the stack from left to
- right instead of right to left. In addition, the function being
- called is responsible for removing arguments from the stack. In
- the C calling convention, the function making the call is
- responsible for restoring the stack. What this means is if you
- make 10 calls to show_mess, there will be 10 instances where the
- stack must be restored upon return from the function. In the
- PASCAL convention, there will be only one instance where this
- will occur and it will be in show_mess just prior to the actual
- return. The end result of using the PASCAL calling convention is
- smaller code size.
-
- It should be noted that the PASCAL convention cannot be used with
- functions that take a variable number of arguments. In addition,
- using the PASCAL convention absolutely requires that all
- functions be prototyped. Otherwise the compiler will generate
- redeclaration errors and the linker will generate unresolved
- external reference errors.
-
-
- Using A Goto
-
- A word about using goto. If you licensed the source code to
- GAPCDR, you will find that we use the goto in several places. It
- should be pointed out that speed and compactness, combined with
- readability, are our number one concerns. We performed several
- experiments with the goto. We took a very simple function that
- consisted of a while loop and a few statements embodied within
- the loop. We took the same function and rewrote it using a
- counter variable and a goto and removed the while loop. The
- assembler output and resultant object code was 1/2 the size as
- that of the function that used the while loop.
-
-
-
-
- Page 13
-
-
-
- GAP Communications GAPCDR
-
-
- We are not proposing that anyone give up the fine structure of C
- and use gotos as a beginning programmer in Basic might do. In
- fact, if you are a beginning programmer in C, you should avoid
- using gotos altogether until you become more proficient.
-
-
- BBS System Files
-
- Since we are firm believers that the BBS system files belong to
- the BBS and should not be altered by any door program, updating
- the BBS system file is not automatic. If you wish that any
- decrease or increase in the user's time (kept track of in the
- timecredit variable), be made permanent, you may, after
- initializing the door, call the function that opens the system
- file. For PCB, this would be PCBOARD.SYS. Keep track of any time
- credits during the door programs operation, then call the
- function that updates the BBS system file. For GAP, you would
- need to re-write DOOR.SYS with any updated information.
-
-
-
- Sysop Setup And Functions
-
-
- These sysop setup and function descriptions should be placed in
- the documentation of your door program. You should, of course,
- change the setup information to fit your particular needs.
-
- Door programs written with the GAPCDR Door Interface Module will
- run on any BBS system that is capable of writing a DOOR.SYS file.
- For GAP Communications and WildCat, you need do nothing special
- when configuring your doors. These programs will write a DOOR.SYS
- file automatically. For PCBoard, you must explicitly tell the
- Door File editor to write a DOOR.SYS file, when setting up a
- GAPCDR door program.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 14
-
-
-
- GAP Communications GAPCDR
-
-
- Configuration
-
- To configure the door for a particular BBS setup, a configuration
- file must be used. At the very minimum, this file will contain
- eight lines. It may contain more than eight depending upon a
- particular door's configuration requirements. The name of the
- file is usually the same as that of the door program but with a
- CNF extension. The minimum requirements for the file are as
- follows:
-
- c:\gap
- The Crow's Nest BBS
- IRQ
- Port Address
- Interface
- DigiBoard Window
- DigiBoard I/O Address
- DigiBoard Channel Number
-
-
- The first line is the full path to your BBS default directory.
- For GAP, this is usually C:\GAP. For PCB, this is usually C:\PCB.
- The second line is the name of your BBS. The third line is the
- IRQ that should be used for the port, and the fourth line is the
- Base Port Address. If you are just using Com 1 and Com 2, you may
- enter a 0 on these two lines.
-
- Lines five through eight are for the Intelligent DigiBoard multi-
- port Communications Card. The DigiBoard routines specifically
- support the COM/Xi series. All four of these lines are required
- even if you are using the Standard Interface. Line five is the
- Communications Port Interface. It must be one of the following:
-
- STANDARD DIGIBOARD INT14/EBIOS FOSSIL
-
- The Standard interface is the one that will normally be used. If
- you are using a DigiBoard then either the DigiBoard or
- Int14/EBIOS interface may be selected. Most sysops will use the
- Int14/EBIOS interface. All input/output to the DigiBoard is
- performed via Interrupt 14 calls and a Device Driver (available
- from DigiBoard) handles the interface between the program and the
- board. The DigiBoard interface uses Direct Programming. GAPCDR
- talks to the board directly without the need for a Device Driver.
- In order to use this interface, a program called RESETDIG.EXE
- must be used in the AUTOEXEC.BAT file to reset the DigiBoard once
- when the computer is first booted. If you do not have this
- program (it is a part of the GAP Communications BBS package) then
- the Int14/EBIOS interface must be used.
-
-
-
- Page 15
-
-
-
- GAP Communications GAPCDR
-
-
- The Fossil interface is specified when a user is using a Fossil
- Device Driver (either BNU or X00). The Fossil interface also uses
- Interrupt 14 calls that are specific to Fossil drivers.
-
- If the Interface is set to STANDARD or FOSSIL, then lines 6
- through 8 will be ignored. If the Interface is INT14/EBIOS, then
- lines 6 and 7 will be ignored.
-
- Line 6 is the DigiBoard Memory Window, or the address the board
- uses as a communications area between itself and the Host
- Computer. This line is used only if the Interface is set to
- DIGIBOARD. It can be set to 0 if the Interface is STANDARD or
- INT14/EBIOS.
-
- Line 7 is the DigiBoard I/O Port Address. This line is used only
- if the Interface is set to DIGIBOARD and can be set to 0
- otherwise.
-
- Line 8 is the DigiBoard Channel Number. This line is required for
- the DIGIBOARD and INT14/EBIOS Interfaces. It is normally 1 - 8
- for the DIGIBOARD Interface and 4 - 11 for the INT14/EBIOS
- Interface. The Channel Number is similar to a Port Number. It
- tells the program which of the DigiBoard Communications ports to
- use.
-
- GAPCDR will obtain the sysop's name from the DOOR.SYS file.
-
- You must now create a batch file to invoke the door. This batch
- file is placed in the directory where you told your BBS SetUp
- program to look for it. Such a batch file might look like this:
-
-
- @echo off
- cd \gap\doors\tourist
- tourist tourist.cnf
- cd \gap
-
-
- As you can see, the door is invoked by passing the configuration
- file name as the first parameter.
-
- You will also need to modify your doors menu files and the data
- file that tells the BBS what your doors are and the security
- level needed to access them. For GAP, these are respectively:
-
- DOORM
- DOORMG
- DOORS.DAT
-
-
-
- Page 16
-
-
-
- GAP Communications GAPCDR
-
-
-
- If you are running multi-nodes, simply create a separate door
- configuration file for each node, and number them. For instance,
- for a 3 node system, you might have the following configuration
- files:
-
- TOURIST1.CNF
- TOURIST2.CNF
- TOURIST3.CNF
-
- The only difference between the three would be the 1st line which
- points to the default directory for the particular node.
-
- Multi-user operation is automatic.The DOOR.SYS file contains a
- field that specifies if the BBS is multi-user or not.
-
-
- Sysop Functions
-
- The following sysop functions are available while awaiting
- keyboard input :
-
- F5 - Shell to DOS.
- F8 - Twit user and return to BBS.
- F10 - Initiate chat with user.
- CF10 - Answer user page bell.
- Home - Main user stats.
- End - Displays sysop keys available.
- PgDn - Secondary user stats.
- Up Arrow - Increase user's time remaining.
- Dn Arrow - Decrease user's time remaining.
-
-
- One of the nicer features about using the TWIT key, is the user
- is not told that "the sysop wants them to return to the BBS".
- Instead, a very plain and simple message of "returning you to the
- BBS" is displayed. This way, the user is given no indication that
- the sysop is hovering about.
-
- When using the F5 shell to DOS key, to return to the door
- program, simply type EXIT at the DOS command prompt. It is not
- necessary to change directories back to the door directory.
- GAPCDR is smart enough to know which drive and directory the door
- program is in and will reset the defaults upon return from DOS.
- In addition, the status line will remain on the screen.
-
- It should be noted that when in a DOS shell, the GAPCDR status
- line is protected by intercepting BIOS video calls. If you use
-
-
-
- Page 17
-
-
-
- GAP Communications GAPCDR
-
-
- ANSI.SYS replacements which write directly to the video, you will
- not have this protection and your status line will scroll off the
- screen
-
- The Up and Down Arrow keys increase and decrease the user's time
- respectively by 5 minutes for each press of the key. There is no
- indication of what is occurring (except by the fact the user's
- time remaining will change), so the sysop should try not to have
- a lead finger. The increase or decrease is effective only while
- the user is in the door. Whether or not these time credits (plus
- or minus) are made a permanent part of the user record so that
- upon return from the DOOR, the BBS program will recognize them,
- depends upon the door author.
-
-
-
- Advanced Applications
-
-
- GAPCDR includes a great many advanced functions which can be used
- with or without the BBS Door Interface (i.e., automatic status
- line, time left checking, keyboard timeout checking, etc).
-
-
- Communications
-
- The communications functions are an integral part of GAPCDR and
- are called automatically by an output routine if the variable
- local is set to 0. However, they may be used stand alone or
- called directly if necessary. These routines are fully self-
- contained with the exception of 3 global variables and 3 external
- functions.
-
- The global variables are:
-
- baud - Port speed
- gotdv - Flag signalling the presense of DESQview
- port - Communications Port Number
-
-
- The external functions are:
-
- no_carrier - Called if carrier is dropped
- timer - Time delay routine
- dv_pause - Called to give up time slice
-
-
-
-
-
-
- Page 18
-
-
-
- GAP Communications GAPCDR
-
-
- Before using the communications routines as stand alone
- functions, you should make a call to dv_here so that it can set
- the gotdv flag. If you are not concerned about the presense of
- DESQview, you must declare this variable and initialize it to 0:
-
- short near gotdv = 0;
-
- Note that it must be declared such that it resides in the default
- data segment. If you declare the variable yourself, you must
- insure that the DESQVIEW.ASM module is not linked in to your
- program. You will need to create a dummy function called dv_pause
- that does nothing but return. This is necessary because even if
- you do not wish to use the dv_pause function, the linker will
- complain if it cannot find it:
-
- void _pascal dv_pause(void);
-
- Next, you must set the variable port to the port number you will
- be using. Ports start at 0, where COM 1 equals Port 0. Then set
- the variable baud to the bps rate you want the port opened at.
-
- Your program will need to include a function called no_carrier.
- It is prototyped as:
-
- void _pascal no_carrier(void);
-
- This function is called by the communications routines when they
- detect that there is no carrier. You may do whatever you wish
- inside this function but keep in mind that it will continue to be
- called if there is no carrier on the port. You most certainly do
- not want to make calls to any of the communications functions
- from inside this routine or a stack overflow will eventually
- result. If you wish to do your own carrier detecting (as you
- would if you were going to be using these functions to create a
- dial out type of program), then this function can simply contain
- a return.
-
- Once you have the global variables configured, the first step in
- initializing the serial port is to make a call to setport.
- Setport creates the receive buffer and then sets up the serial
- port. After the port is configured, you should then call
- init_port to set the baud, parity, and data bits. Init_port
- supports all the baud rates that a UART on an IBM type of
- computer is capable of utilizing. After this the port is fully
- configured and may now be utilized. Before your program ends, you
- must call reset_port to restore the interrupt vector back the way
- it was.
-
-
-
-
- Page 19
-
-
-
- GAP Communications GAPCDR
-
-
- The main input routines are:
-
- comgetc - Get a single character from the port
- comgetd - Get a character with timeout
-
-
- The main output routines are:
-
- computc - Send a single character
- computs - Send a string
-
-
- There are routines for checking carrier, turning DTR on and off,
- checking if there are any characters in the receive buffer, and
- clearing the receive buffer.
-
- If you need to change baud rates simple set the variable baud to
- whatever bps rate you want to change to and then call init_port.
-
-
- DOS Window
-
- GAPCDR includes some very advanced functions for setting up what
- we call a DOS Window. This is a Window that you define on the
- local screen and to which all DOS output will be redirected. For
- instance, if you needed to shell to DOS to run PKUNZIP or DSZ,
- you could set up a DOS Window and all output from these two
- programs will be contained inside the window. The window can also
- be used without shelling to DOS although there is really no
- practical use for doing so.
-
- To set up a DOS window, the first thing you should do is make a
- call to get_attr so that the current screen colors can be stored
- away. This is necessary because you may want to use special
- colors in your DOS window. By storing the original screen
- attributes, they can be restored when you close the window,
- thereby keeping the user's screen colors the way the user likes
- them!
-
- At the beginning of your program call get_attr. Do this before
- you do any screen output. You will then make several calls to the
- various GAPCDR functions to setup your DOS window. Once it is
- configured, you can then shell to DOS and do whatever you like.
- All screen output will take place inside the window. Please note
- that if you use a console driver other than CON or ANSI.SYS (and
- this generally includes all so called video speed up programs),
- or run a program that writes directly to the screen, then output
- will not take place inside of the window. This is because video
-
-
-
- Page 20
-
-
-
- GAP Communications GAPCDR
-
-
- speed up programs generally write directly to the screen instead
- of using the BIOS.
-
- To see how the DOS window works, after setting it up, issue the
- following call:
-
- system("COMMAND");
-
- This will put you in a DOS shell. You may then execute various
- DOS functions and get a feel for what it looks like. Be sure to
- type "exit" to return to your program.
-
- When you no longer need the DOS window, it is imperitive that you
- remove the interrupt 10 (BIOS) intercepter or your computer will
- hang when you exit the program.
-
- There is a fully working example of a DOS Window in the CDOOR
- example program. It shows how to save a portion of the screen,
- draw a box, set up the interrupt 10 intercepter and shell to DOS.
- Upon return from the shell, it will remove the DOS Window.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 21
-
-
-
- GAP Communications GAPCDR
-
-
- Variables
-
-
-
- Defines
-
- The following defines are used when calling show_mess.
-
- NO - Defined as 0
- YES - Defined as 1
-
- Ansi Variables
-
- ANSI strings contain the actual ANSI color sequences.
-
- A_BLACK - ANSI codes for Black
- A_BLUE - ANSI codes for Blue
- A_BROWN - ANSI codes for Brown
- A_CYAN - ANSI codes for Cyan
- A_GREEN - ANSI codes for Green
- A_MAGENTA - ANSI codes for Magenta
- A_RED - ANSI codes for Red
- A_WHITE - ANSI codes for White
-
-
- A_BBLACK - ANSI codes for Grey
- A_BBLUE - ANSI codes for bright Blue
- A_BCYAN - ANSI codes for bright Cyan
- A_BGREEN - ANSI codes for bright Green
- A_BMAGENTA - ANSI codes for bright Magenta
- A_BRED - ANSI codes for bright Red
- A_BWHITE - ANSI codes for bright White
- A_YELLOW - ANSI codes for Yellow
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 22
-
-
-
- GAP Communications GAPCDR
-
-
- DOOR.SYS Variables
-
- DOOR.SYS variables are initialized while reading the DOOR.SYS
- file. These variables are the door programmer's connection to the
- BBS.
-
-
- Short Integers
-
- alarm - 0 = caller alarm off, 1 = on
- baud - DTE bps rate (unsigned)
- bell - 0 = page bell off, 1 = bell on
- color - 0 = no color, 1 = color
- curfiles - current files downloaded
- dflt_color - BBS default color
- digiseg - DigiBoard Memory Window
- digiport - DigiBoard I/O Port
- digichnl - DigiBoard Channel #
- expert - 0 = novice, 1 = expert
- interface - 0 = Standard, 1 = DigiBoard, 2 = INT14/EBIOS
- level - user's security level
- local - 0 = remote user, 1 = local user
- maxfiles - max files available
- minsleft - minutes left at door start
- multi - 1 = system is multi-user
- node - node number in use, 0 = single
- page - page length
- parity - actually data bits, not used
- port - com port being used
- printer - 0 = printer off, 1 = printer on
- realcredit - time credits from the BBS
- screen - 0 = screen off, 1 = screen on
- userbaud - remote user's bps rate (unsigned)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 23
-
-
-
- GAP Communications GAPCDR
-
-
- Long Integers
-
- curbytes - current download bytes
- doors_open - total doors opened
- downbytes - total download bytes
- downloads - total number of downloads
- maxbytes - max bytes can download
- mesleft - total messages left
- recnum - user's record number
- timeson - # of times on
- upbytes - total upload bytes
- uploads - total number of uploads
-
- Character Arrays
-
- bphone - user's business phone number
- city - user's home town
- event_time - event run time
- fname - user's first name
- handle - caller's Handle
- hphone - user's home phone number
- last_new - last new files scan
- lastdate - last date user was on
- lname - user's last name
- password - user's password
- subscrip - date user's subscription expires
- username - user's full name
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 24
-
-
-
- GAP Communications GAPCDR
-
-
- Global Variables
-
- These variables are the documented, global variables (initialized
- and used by GAPCDR). They may be modified and/or used at the
- programmer's discretion.
-
-
- Characters
-
- chat - true if chatting with user
- clockon - 0 no clock, 1 display clock
- column - column we are at now
- endview - true if dont want to viewany more
- flag - flag that a space was pressed
- instatus - if doing status line
- noup - if 1, dont uppercase characters
- NS - true if in Non Stop mode
- redisplay - true if wants to start over
- usemore1 - true if showing a file
- view - true to use the more prompt
- wordwrap - column to wrap words at
-
- Short Integers
-
- base_add - base address for port
- irq - IRQ for port
- lines - # of lines currently displayed
- normal - current display color
- timecredit - any time credits user may have
- timeleft - time user has left
-
- Long Integers
-
- starttime - time door opened
- temptime - for calculating time out
- timenow - current time
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 25
-
-
-
- GAP Communications GAPCDR
-
-
- Character Arrays
-
- anystring - global garbage collector
- bbs_dir - path to DOOR.SYS
- birthday - caller's birth date
- board_name - name of the BBS
- BS - backspace characters
- CRLF - carriage return/line feed characters
- curtime - holds the current time as a string
- gendir - path to the BBS gen dir
- maindir - path to the BBS main dir
- strtime - holds the time string
- sysname - sysop's name
-
- Structures
-
- GAP_USER user - GAP's User Record
- PCBSYS pcbsys - PCB's System Record
- PCBUSER pcbuser - PCB's User Record
-
-
- These structures are fully commented in the GAPCDR.H header file.
- Note that when utilizing the GAP user structure, all string
- fields are fully padded with spaces and the last position must be
- a 0.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 26
-
-
-
- GAP Communications GAPCDR
-
-
- Functions - Quick Reference
-
-
- access1 - Checks for the existence of a file.
- ansi - Displays ANSI color strings.
- backspace - Sends one or more backspaces.
- ckeypress - Checks for a remote or local key press.
- clear_scrn - Clears the local and remote screens.
- clr_buf - Cleare the communications receive buffer.
- cls - Clears the 1st 23 lines on the local screen.
- cls_all - Clears the entire local screen.
- comgetc - Gets a character from com port.
- comgetd - Geta a character from com port with timeout.
- computb - Sends a buffer of data to com port.
- computc - Sends a character to com port.
- computs - Sends a string to com port.
- cursoff - Turns local cursor off.
- curson - Turns local cursor on.
- do_chat - To allow sysop to chat with remote user.
- dtr - Toggels the DTR line on or off.
- dv_here - Checks for the presense of DESQView.
- dv_pause - Gives up remainder of time slice to DV.
- elap_time - Computes elapsed time.
- empty - Empties a string.
- fix_color - Modifies ANSI driver for color or mono.
- gapputc - Sends a character to local and remote.
- gapputs - Sends a string to local and remote screens.
- getakey - Gets one key responses.
- getkeyc - Gets keyboard character and scan code.
- get_attr - Gets startup video attribute.
- get_random - Returns a random number.
- get_string - Gets a string of characters.
- init_ansi - Initializes ANSI driver.
- init_com - Initializes Communications Port.
- init_door - Initializes the Door.
- init_port - Sets up Communications Port.
- iscd - Checks if there is a Carrier.
- leave - Shuts down door and returns to the BBS.
- lputc - Sends a character to local screen.
- lputs - Sends a string to local screen.
- make_sound - Makes noise on local computer.
- more - Checks for a full screen.
- nl - Sends a CR/LF to local and remote.
- no_carrier - Called by the Comm Routines if Carrier lost.
- pagesysop - Alerts sysop that the user wants to chat.
- pause - Sends a "Press [Any Key] To Continue" prompt.
- putkey - Used by chat for word wrapping.
- read_cnf - Reads the door configuration file.
-
-
-
- Page 27
-
-
-
- GAP Communications GAPCDR
-
-
- read_doorsys - Reads DOOR.SYS.
- read_gapuser - Reads USERS.DAT.
- read_pcbsys - Reads PCBOARD.SYS.
- read_pcbuser - Reads PCB USERS file.
- read_score - Reads and displays top 10 scores.
- reset_port - Restores Communications Port.
- restore_screen - Restores a portion of the screen.
- rest_cbreak - Restores Ctrl-Break vector.
- rest_int10 - Restores BIOS vector.
- rts - Toggels RTS line on or off.
- rxempty - Checks if any characters in receive buffer.
- save_screen - Saves a portion of the screen.
- setport - Initializes Communications port.
- set_attr - Sets video attributes.
- set_cbreak - Initializes Ctrl-Break vector.
- set_cord - Sets up a DOS Window.
- set_int10 - Initializes BIOS trapper.
- set_status - Displays status line.
- show_file - Displays text files.
- show_mess - Displays a message.
- timer - Time Delay.
- time_credit - Gives credits for time used.
- time_left - Computes time remaining.
- trim - Trims spaces from string.
- update_clock - Updates status line clock.
- wrap_word - Wraps a word.
- write_gapuser - Writes USERS.DAT.
- write_pcbsys - Writes PCBOARD.SYS.
- write_pcbuser - Writes PCB USERS.
- write_score - Creates and maintains top 10 scores file.
-
-
- Functions - Detailed Reference
-
-
- Functions will return either a void (nothing), a short value, or
- a character pointer.
-
- The function descriptions will note whether or not a function is
- high level or low level. The high level functions are basically
- the only functions you will ever need to use. When necessary,
- they will call other functions to carry out their work. The low
- level functions, on the other hand, are more single purpose, and
- they generally require calls to other low level functions to
- perform the same task as one call to a high level function.
-
-
-
-
-
-
- Page 28
-
-
-
- GAP Communications GAPCDR
-
-
- access1
- -----------------------------------------------------------------
-
- Purpose Checks for the existence of a file.
-
- short access1(char *filename);
-
- filename Full path and name of file
-
- Type High Level
-
- Description This function is used to check for the existence of
- a file. It works in a multi-user environment and is
- not affected by file sharing attributes.
-
- Return Value 0 = File exists, 1 = File not found.
-
- Example
-
- if ((access1("FILE.DAT")))
- show_mess("Sorry, File does not Exist!", YES,YES);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 29
-
-
-
- GAP Communications GAPCDR
-
-
- ansi
- -----------------------------------------------------------------
-
- Purpose Displays ANSI color sequences.
-
- void ansi(char *color);
-
- color Ansi color string
-
- Type High Level
-
- Description This function will send a string of ANSI escape
- sequences to the remote user and to the local
- console. The ANSI codes for the various colors are
- declared as global variables. If the remote or
- local user is in non graphics mode, the function
- returns immediately.
-
- Return Value None.
-
- Example ansi(A_BWHITE); // Change color to bright white
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 30
-
-
-
- GAP Communications GAPCDR
-
-
- backspace
- -----------------------------------------------------------------
-
- Purpose Sends one or more backspaces.
-
- void backspace(short num);
-
- num Number of backspaces to send
-
- Type High Level
-
- Description In order to actually erase a character on the
- screen, you must send a 3 character sequence which
- consists of backspace, space, backspace. This
- function will send as many of these 3 character
- sequences as you specify in the parameter list.
-
- Return Value None.
-
- Example backspace(1); // erase last character sent
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 31
-
-
-
- GAP Communications GAPCDR
-
-
- ckeypress
- -----------------------------------------------------------------
-
- Purpose Checks for a remote or local key press.
-
- short ckeypress(void);
-
- Type High Level
-
- Description This function will check the local keyboard as well
- as the communications receive buffer to see if a
- key is waiting to be read. It is most often used in
- loops that monitor keyboard timeout, time
- remaining, etc.
-
- Return Value 0 = no key is waiting, 1 = a key is waiting.
-
- Example c = ckeypress(); // key pressed?
-
- while(!ckeypress()) // do nothing
- { // until a key is pressed
- dv_pause() // give up time slice
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 32
-
-
-
- GAP Communications GAPCDR
-
-
- clear_scrn
- -----------------------------------------------------------------
-
- Purpose Clears local and remote screens.
-
- void clear_scrn(void);
-
- Type High Level
-
- Description This routine will use the assembler routine cls to
- clear the first 23 lines of the local screen. If
- the remote caller is in non-color mode, it sends a
- CTRL-L to the remote screen, otherwise it sends the
- ANSI clear screen sequence.
-
- Return Value None.
-
- Example clear_scrn(); // clear screen
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 33
-
-
-
- GAP Communications GAPCDR
-
-
- clr_buf
- -----------------------------------------------------------------
-
- Purpose Clears the Communications receive buffer.
-
- void clr_buf(void);
-
- Type Low Level
-
- Description Empties the receive buffer such that any pending
- characters are simply ignored.
-
- Return Value None.
-
- Example clr_buf(); // clear the receive buffer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 34
-
-
-
- GAP Communications GAPCDR
-
-
- cls
- -----------------------------------------------------------------
-
- Purpose Clears the first 23 lines on the local screen.
-
- void cls(void);
-
- Type Low Level
-
- Description This function will clear the first 23 lines on the
- local screen, thereby protecting the bottom 2
- lines.
-
- Return Value None.
-
- Example cls(); // clear 1st 23 lines
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 35
-
-
-
- GAP Communications GAPCDR
-
-
- cls_all
- -----------------------------------------------------------------
-
- Purpose Clears the entire local screen.
-
- void cls_all(void);
-
- Type Low Level
-
- Description This function will clear the entire local screen.
- It is used by leave to tidy up the screen.
-
- Return Value None.
-
- Example cls_all(); // clear entire screen
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 36
-
-
-
- GAP Communications GAPCDR
-
-
- comgetc
- -----------------------------------------------------------------
-
- Purpose Retrieve a character from communications buffer.
-
- short comgetc(void);
-
- Type Low Level
-
- Description Checks the communications receive buffer and
- returns the next character, if any.
-
- Return Value Next character in buffer or -1 for no characters to
- read.
-
- Example c = comgetc(); // get a character from remote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 37
-
-
-
- GAP Communications GAPCDR
-
-
- comgetd
- -----------------------------------------------------------------
-
- Purpose Retrieve a character from comminications buffer
- with delay.
-
- short comgetd(short secs);
-
- secs Number of seconds to wait
-
- Type Low level
-
- Description This function is the same as comgetc, except that
- if there are no characters in the receive buffer,
- it will wait for the number of seconds you specify.
- Comgetd is fully DESQview aware and will give up
- the program's time slice while waiting for incoming
- characters.
-
- Return Value Next character in buffer or -10 for time-out (no
- characters to read).
-
- Example
-
- if ( (comgetd(2)) == -10) // wait for 2 seconds
- ; // nothing happening
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 38
-
-
-
- GAP Communications GAPCDR
-
-
- computb
- -----------------------------------------------------------------
-
- Purpose Sends a buffer of data out the communications port.
-
- void computb(char *buffer,short len);
-
- buffer Buffer containing data to send
- len Number of bytes to send
-
- Type Low Level
-
- Descripton This function will send a user suplied buffer of
- len bytes out the communications port, one byte at
- a time. It will not return until all characters
- have been sent.
-
- Return Value None.
-
- Example computb(buffer,100); // Send 100 bytes of data
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 39
-
-
-
- GAP Communications GAPCDR
-
-
- computc
- -----------------------------------------------------------------
-
- Purpose Sends a single character out the communications
- port.
-
- void computc(unsigned char ch);
-
- ch Character to send
-
- Type Low Level
-
- Description Will send a single character out the communications
- port.
-
- Return Value None.
-
- Example computc('A'); // Send a character
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 40
-
-
-
- GAP Communications GAPCDR
-
-
- computs
- -----------------------------------------------------------------
-
- Purpose Sends a string of characters out the communications
- port.
-
- void computs(char *str);
-
- str String to send
-
- Type Low Level
-
- Description Will send a string of characters out the
- communications port. Note that unlike computb, the
- number of bytes to send is determined by the length
- of the string. Therefore this function stops
- sending characters when it encounters the null
- byte.
-
- Return Value None.
-
- Example computs("Send this string"); // send a string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 41
-
-
-
- GAP Communications GAPCDR
-
-
- cursoff
- -----------------------------------------------------------------
-
- Purpose Turns the local cursor off.
-
- void cursoff(void);
-
- Type Low Level
-
- Description This function is used to turn the cursor on the
- local monitor off.
-
- Return Value None.
-
- Example cursoff(); // turn the cursor off
-
-
-
-
-
- curson
- -----------------------------------------------------------------
-
- Purpose Turns the local cursor on.
-
- void curson(void);
-
- Type Low Level
-
- Description This function is used to turn the cursor on the
- local monitor on.
-
- Return Value None.
-
- Example curson(); // turn the cursor on
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 42
-
-
-
- GAP Communications GAPCDR
-
-
- do_chat
- -----------------------------------------------------------------
-
- Purpose To allow sysop to chat with remote user.
-
- void do_chat(void);
-
- Type High Level
-
- Description This function allows a one on one chat with a re-
- mote user. If the caller is in graphics mode, the
- sysop's key presses will be displayed in green and
- the remote user's key presses will be displayed in
- white. Text will automatically wrap at column 76.
- To exit chat, press either the ESC key or type a
- CTRL-X. Note that the user may also send these
- characters to end chat. The user will receive full
- credit for the time spent chatting with the sysop.
- However, this function will not update the BBS
- system file so it is possible that the user may be
- logged off (with an out of time message) when
- he/she returns to the BBS.
-
- Return Value None.
-
- Example do_chat(); // chat with caller
-
- empty(response,1); // initialize string
-
- get_string(response); // get a string
-
- if (response[0] == 'P') // paging sysop
- do_chat(); // chat with sysop
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 43
-
-
-
- GAP Communications GAPCDR
-
-
- dtr
- -----------------------------------------------------------------
-
- Purpose Toggle the DTR line on and off.
-
- void dtr(short how)
-
- how 0 = Turn DTR off.
- 1 = Turn DTR on
-
- Type Low Level
-
- Description This routine is used to turn the DTR line of the
- communications port on or off. Turning DTR off
- while there is a carrier will cause the modem to
- drop carrier on the remote caller. In order to send
- commands to the modem, DTR needs to be on.
-
- Return Value None.
-
- Example
-
- dtr(1); // turn DTR on
- computs("ATZ"); // reset the modem
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 44
-
-
-
- GAP Communications GAPCDR
-
-
- dv_here
- -----------------------------------------------------------------
-
- Purpose Checks to see if the program is running under
- DESQview.
-
- short dv_here(void);
-
- Type Low Level
-
- Description This function should generally be called when a
- program first starts (before any screen output is
- performed). It makes a special DOS call to see if
- DESQview is installed. If so, it sets an internal
- flag indicating the presense of DV. If the program
- is detected to be running under DESQview then all
- "do nothing" loops (those loops that are looking
- for something to do but because they are waiting
- for keyboard or com input, are basically taking up
- computer time doing nothing), will give up the
- remainder of their time slice after they figure out
- there is nothing for them to do. In addition,
- because the built in ANSI driver writes directly to
- the screen, if DESQview is present, the driver will
- instead write to DV's video shadow buffer. This
- function is automatically called by init_door so it
- is not necessary to call it again.
-
- Return Value DESQview version number or 0 for not installed.
-
- Example
-
- if ( (dv_here()))
- show_mess("We are running under DESQview!", NO,YES);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 45
-
-
-
- GAP Communications GAPCDR
-
-
- dv_pause
- -----------------------------------------------------------------
-
- Purpose Give up remainder of time slice to DESQview.
-
- void dv_pause(void);
-
- Type Low Level
-
- Description If DESQview is installed, this function will make a
- call to DV such that DV will immediately switch to
- another task. Note that dv_here must be called at
- the beginning of the program since it sets an
- internal variable that this function checks to see
- if DESQview is running.
-
- You should use this function inside of all "do
- nothing" loops.
-
- Return Value None.
-
- Example
-
- time (&temptime); // start timer
-
- while (!getakey()) // until a key is pressed
- {
- elap_time(); // check time remaining
- dv_pause(); // give up time slice
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 46
-
-
-
- GAP Communications GAPCDR
-
-
- elap_time
- -----------------------------------------------------------------
-
- Purpose Computes elapsed time while waiting for keyboard
- input.
-
- void elap_time(void);
-
- Type High Level
-
- Description This function is used in loops that await a key-
- board response. Prior to entering the loop, the
- variable called temptime should be initialized with
- the current time. Once inside the loop, this
- function should be called to keep track of the
- elapsed time. If there is no keyboard response
- within 4 minutes, the user will be logged off.
-
- Return Value None.
-
- Example
-
- time (&temptime); // start timer
-
- while (!getakey()) // until a key is pressed
- {
- elap_time(); // check time remaining
- dv_pause(); // give up time slice
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 47
-
-
-
- GAP Communications GAPCDR
-
-
- empty
- -----------------------------------------------------------------
-
- Purpose Empties a string to all spaces.
-
- void empty(char *str,short len);
-
- str The string to be emptied
- len Number of bytes to clear
-
- Type High Level
-
- Description Before using the string input routine, get_string,
- the string must first be cleared to the maximum
- number of bytes allowed to be input. Empty clears
- the string to all spaces and adds a null byte at
- the end. The null byte is not counted in the len
- parameter.
-
- Return Value None.
-
- Example
-
- char instr [11];
-
- empty(instr,10); // empty the string
- get_string(instr); // get up to 10 characters
- // of input
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 48
-
-
-
- GAP Communications GAPCDR
-
-
- fix_color
- -----------------------------------------------------------------
-
- Purpose Modify ANSI driver according to user's color.
-
- void fix_color(void);
-
- Type Low Level
-
- Description The ANSI driver is self modifying, meaning that
- depending upon the color preference of the user, it
- will adjusts its code accordingly. This function is
- called by init_ansi and should never need to be
- called by the programmer directly unless the
- programmer provides a menu choice whereby a caller
- may toggle his/her color mode on and off. In such a
- case, you would immediately need to call fix_color
- so that the ANSI driver can adjusts itself. The
- caller's color preference is stored in the variable
- color where 0 means no color, and 1 means color.
-
- Return Value None.
-
- Example
-
- show_mess("Toggle Color",NO,NO); // part of menu
-
- empty(response,1); // clear string
- get_string(response); // get response to menu
-
- if (response[0] == 'C') // wants to toggle color
- {
- if (color)
- color = 0
- else
- color = 1;
-
- fix_color(); // fix up ANSI driver
- }
-
-
-
-
-
-
-
-
-
-
-
-
- Page 49
-
-
-
- GAP Communications GAPCDR
-
-
- gapputc
- -----------------------------------------------------------------
-
- Purpose Sends a single character to local and remote.
-
- void gapputc(short ch);
-
- ch Character to send
-
- Type Low Level
-
- Description This is one of the main output routines that is
- used internally by GAPCDR. It is part of the ANSI
- driver. It will send a single character to the
- local screen and if a remote caller is on, will
- send the character to the communications port as
- well.
-
- Return Value None.
-
- Example gapputc('A'); // display a character
-
- while ( (c = getakey()) == 0) // wait for keypress
- dv_pause(); // give up time slice
-
- gapputc(c); // display character
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 50
-
-
-
- GAP Communications GAPCDR
-
-
- gapputs
- -----------------------------------------------------------------
-
- Purpose Sends a string of characters to local and remote.
-
- void gapputs(char *str);
-
- str String to send
-
- Type Low Level
-
- Description This is one of the main output routines that is
- used internally by GAPCDR. It is part of the ANSI
- driver. It will send a string of characters to the
- local screen and if a remote caller is on, will
- send the string to the communications port as well.
- If a caller is in mono mode, the ANSI driver will
- strip any ANSI sequences from the string. This
- allows you to "colorize" your strings with ANSI
- codes and not have to worry if the caller has his
- color setting turned on.
-
- This routine is much faster than show_mess (in
- fact, this is the function that show_mess calls),
- but it does not provide for ringing the bell or
- automatically sending a carriage return and line
- feed after the string. You can however embed these
- characters into the string. It is suggested that
- you not embed the bell character into the string
- since the sysop may have the alarm toggled off and
- may not appreciate the computer making noise when
- he/she doesn't want it to.
-
- Return Value None.
-
- Example gapputs("This is a string of characters");
-
- // this example embeds the CR/LF pair at the beginning
- // and end of the string
-
- gapputs("\r\nThis is a string\r\n");
-
-
-
-
-
-
-
-
-
-
- Page 51
-
-
-
- GAP Communications GAPCDR
-
-
- getakey
- -----------------------------------------------------------------
-
- Purpose Gets one key responses
-
- short getakey(void);
-
- Type High Level
-
- Description This is the main keyboard input routine. It is
- called by get_string as well as any keyboard
- polling loops. It checks the receive buffer as well
- as the local keyboard for a key press. If one is
- not found it returns 0. The character input is not
- echoed. Since 99% of all keyboard input comes from
- this routine, it checks for time remaining,
- keyboard time-out, as well as special sysop
- function keys. The timeleft variable is updated by
- this routine. This is the variable you would
- normally use in a prompt such as:
-
- [20 mins left] Main Command :
-
- Return Value ASCII code for the key pressed or 0.
-
- Example c = getakey(); // get a character
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 52
-
-
-
- GAP Communications GAPCDR
-
-
- getkeyc
- -----------------------------------------------------------------
-
- Purpose Gets keyboard character and scan code.
-
- short getkeyc(void);
-
- Type Low Level
-
- Description This is the main keyboard input routine which is
- called internally by getakey. It returns the
- keyboard character or if the key struck was an
- extended key, it will return a unique code. These
- codes are defined in GAPSTRUC.H as F1, Home, etc.
- This function always waits for a keypress so it
- should not be called unless you know there is a key
- waiting.
-
- Return Value ASCII code for the key pressed or a unique code for
- extended keys.
-
- Example keyc = getkeyc(); // get a keyboard character
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 53
-
-
-
- GAP Communications GAPCDR
-
-
- get_attr
- -----------------------------------------------------------------
-
- Purpose Retrieves the current screen color.
-
- void get_attr(void);
-
- Type Low Level
-
- Description This function is used at the very start of a
- program to "remember" the screen color. It stores
- the color in a special location so that the screen
- attributes can be restored by the DOS Window
- routines. You do not need to call this routine if
- you have no plans to use the DOS Window.
-
- Return Value None. Attribute is stored in an internal location.
-
- Example get_attr(); // Remember screen attributes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 54
-
-
-
- GAP Communications GAPCDR
-
-
- get_random
- -----------------------------------------------------------------
-
- Purpose Gets a random number.
-
- short get_random(short low,short high);
-
- low Lowest number acceptible
- high Highest number acceptible
-
- Type High Level
-
- Description This routine is provided because it is much easier
- to use and understand than the C library routine
- (which drags in the floating point library).
- Provide as parameters, two integers. The first
- parameter is the lowest number you will accept as a
- random number, and the second parameter is the
- highest random number you will accept. The function
- will return a random integer between the range
- specified (low and high are included in the range
- of numbers). It is not necessary to seed the random
- number generator as this is done automatically for
- you during program initialization.
-
- Return Value A random number between range specified.
-
- Example rndnum = get_random(1,10); // get a random num
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 55
-
-
-
- GAP Communications GAPCDR
-
-
- get_string
- -----------------------------------------------------------------
-
- Purpose Gets a string of characters.
-
- void get_string(char *string);
-
- string Storage for input characters
-
- Type High Level
-
- Description This is the main input routine. It will get a
- string from either the remote user or the local
- keyboard. The string passed will be set to the
- characters received. The length of the input string
- is determined by the length of the string passed.
-
- Before calling, you must initialize the passed
- string with spaces. The number of spaces in the
- string determines the number of characters allowed
- to be input. If a user attempts to type more
- characters than allowed, the cursor will not move
- pass the end of the string. Input ends when the
- Enter key is pressed.
-
- To initialize the string, use the empty function.
-
- WARNING : It is extremely important that the passed
- string be initialized. Failure to set the string to
- spaces, will cause unpredictable results!
-
- This function does not return a new string con-
- taining the keyboard input. Instead, it modifies
- the string you pass to it in the parameter list.
- The string will be stripped of any trailing spaces.
-
- Get_string automatically uppercases the string. If
- you wish to disable this feature, set the variable
- noup to 1 just prior to calling the function, and
- then set it back to 0 when the function returns.
-
- Get_string will automatically check for keyboard
- activity so it is not necessary for you to do so.
-
- Return Value None
-
-
-
-
-
-
- Page 56
-
-
-
- GAP Communications GAPCDR
-
-
- Example get_string(instr); // get a string
-
- char instr [20];
-
- // First initialize the string. In this case we will
- // accept up to 10 characters
-
- empty(instr,10); // initialize string
- get_string(instr); // get string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 57
-
-
-
- GAP Communications GAPCDR
-
-
- init_ansi
- -----------------------------------------------------------------
-
- Purpose Initialize ANSI driver.
-
- void init_ansi(void);
-
- Type Low Level
-
- Description This routine is called by init_door so it is not
- necessary for you to call it again. It sets up the
- ANSI driver so that it knows the sysop's default
- color, the current cursor position, etc.
-
- Return Value None.
-
- Example init_ansi(); // Initialize ANSI driver
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 58
-
-
-
- GAP Communications GAPCDR
-
-
- init_com
- -----------------------------------------------------------------
-
- Purpose To configure the communications port.
-
- void init_com(void);
-
- Type High Level
-
- Description This function takes the information provided by
- DOOR.SYS and makes a call to setport to set up the
- communications port and receive buffer. It is
- called internally by init_door. If there is an
- error setting up the port, init_com will exit the
- program.
-
- Return Value None. Exits on Error.
-
- Example init_com(); // Initialize com port
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 59
-
-
-
- GAP Communications GAPCDR
-
-
- init_door
- -----------------------------------------------------------------
-
- Purpose Initializes the GAPCDR functions.
-
- void init_door(void);
-
- Type High Level
-
- Description This routine must be called immediately after
- calling read_cnf. It initializes the door, opens
- and reads system files, initializes the com port,
- initializes global variables and in general, makes
- sure that all of the files required for operation
- are present. If an error occurs while trying to
- initialize, the function will display an error
- message and end the program.
-
- Return Value None. Exits on error.
-
- Example
-
- fp = read_cnf("DOOR.CNF"); // read cnf file
- init_door(); // init the door
- fclose(fp); // close configuration file
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 60
-
-
-
- GAP Communications GAPCDR
-
-
- init_port
- -----------------------------------------------------------------
-
- Purpose Initialize port to baud, data, and parity.
-
- init_port(short parity, short data);
-
- parity 0 = None, 1 = Even
- data 6,7,or 8 data bits
-
- Type Low Level
-
- Description Sets the communications port to the parity and data
- bits passed as parameters. The baud rate is
- contained in a global variabled called baud. The
- port number (where COM 1 equals port 0) is
- contained in a global variabled called port.
-
- Return Value 0 = Successful, 1 = Error.
-
- Example init_port(0,8) // Initialize to N,8,1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 61
-
-
-
- GAP Communications GAPCDR
-
-
- iscd
- -----------------------------------------------------------------
-
- Purpose Check for Carrier on the Communications Port.
-
- short iscd(void);
-
- Type Low Level
-
- Description This function allows you to test the communications
- port for a remote carrier signal. Note that carrier
- checking is performed automatically by the
- communications routines so it is not necessary for
- you to explicitly check for carrier unless you have
- a need to override the default actions taken.
-
- Return Value Returns 0 if there is no carrier and 1 if there is
- a carrier.
-
- Example
-
- if ( !iscd()) // is there a carrier?
- leave(99); // nope, lets quit
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 62
-
-
-
- GAP Communications GAPCDR
-
-
- leave
- -----------------------------------------------------------------
-
- Purpose Exits the program.
-
- void leave(short code);
-
- code Exit code to terminate with
-
- Type High Level
-
- Description When the program terminates, it must call this
- function to end. This is the only proper exit from
- the door. It is of vital importance to end your
- program through this function so that the interrupt
- service routines that are installed at door
- beginning can be removed.
-
- Return Value None.
-
- Example leave(0); // Exit the program
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 63
-
-
-
- GAP Communications GAPCDR
-
-
- lputc, lputs
- -----------------------------------------------------------------
-
- Purpose To display a character or string of characters on
- the local screen.
-
- void lputc(char ch);
-
- ch Character to display
-
- void lputs(char *str);
-
- str String to display
-
- Type Low Level
-
- Description Like gapputc and gapputs, these functions display
- either a single character or a string of
- characters, however the characters are not
- simultaneously sent to the communications port as
- well. These functions override the color mode of
- the caller and allow you to send ANSI color to the
- local screen even if the caller does not have his
- color flag turned on.
-
- Return Value None.
-
- Example lputs("This is a string"); // Send string
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 64
-
-
-
- GAP Communications GAPCDR
-
-
- more
- -----------------------------------------------------------------
-
- Purpose Checks for a full screen and issues a More Prompt.
-
- void more(void);
-
- Type High Level
-
- Description This is an internal routine that is called by the
- character output functions. It issues a more prompt
- if the number of lines displayed reaches the user's
- page length.
-
- Return Value None.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 65
-
-
-
- GAP Communications GAPCDR
-
-
- nl
- -----------------------------------------------------------------
-
- Purpose Sends a Carriage Return and Line Feed to local and
- remote.
-
- void nl(short lines);
-
- lines Number of New Lines to send
-
- Type High Level
-
- Description To send a blank line, call this routine with the
- number of blank lines you wish to send.
-
- Return Value None
-
- Example nl(2); // send two blank lines
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 66
-
-
-
- GAP Communications GAPCDR
-
-
- no_carrier
- -----------------------------------------------------------------
-
- Purpose Used by the Communications routines.
-
- void no_carrier(void);
-
- Type High Level
-
- Description Internal routine that is called when there is a
- loss of carrier. Displays a message to the local
- screen and then calls leave to terminate the
- program. This function must not be removed from
- GAPCDR. You may modify it to change the default
- actions that are taken, but the communications
- routines must have access to it if there is a loss
- of carrier.
-
- Return Value None.
-
- Example
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 67
-
-
-
- GAP Communications GAPCDR
-
-
- pagesysop
- -----------------------------------------------------------------
-
- Purpose Alerts sysop that user wants to chat.
-
- void pagesysop(void);
-
- Type High Level
-
- Description Allows the programer to provide the user with a
- Page Sysop command. The page lasts for 30 seconds
- and can be aborted by typing CTRL-K. If the sysop's
- page bell is on, the sysop's speaker will also
- sound. To answer the page, the sysop should press
- CTRL-F10.
-
- Return Value None.
-
- Example pagesysop(); // tell sysop
-
- empty(response,1); // initialize string
-
- get_string(response); // get a response
-
- if (response[0] == 'P') // wants to chat
- pagesysop(); // tell sysop
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 68
-
-
-
- GAP Communications GAPCDR
-
-
- pause
- -----------------------------------------------------------------
-
- Purpose Sends a "Press [Any Key] To Continue" prompt.
-
- void pause(void);
-
- Type High Level
-
- Description This function sends a pause prompt and waits for a
- key press.
-
- Return Value None.
-
- Example pause(); // display pause prompt
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 69
-
-
-
- GAP Communications GAPCDR
-
-
- putkey
- -----------------------------------------------------------------
-
- Purpose Used by chat routines to keep track of word
- wrapping.
-
- void putkey(short ch);
-
- ch Character to send
-
- Type High Level
-
- Description This is the main output routine for the chat
- functions. It keeps track of the current column,
- and decides when it is time to wrap a word.
-
- Return Value None.
-
- Example
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 70
-
-
-
- GAP Communications GAPCDR
-
-
- read_cnf
- -----------------------------------------------------------------
-
- Purpose Reads the door configuration file.
-
- FILE *read_cnf(char *path);
-
- path Full path and name of configuration file
-
- Type High Level
-
- Description Opens the configuration file for the current door.
- Normally the passed parameter is the name of the
- door with a .CNF extension (it is assumed that the
- file is in the same directory as the door program).
- If an error occurs, the program ends immediately.
-
- WARNING : The first eight lines of this configura-
- tion file belong to the GAPCDR interface module.
- You are free to use the information, but the in-
- formation contained in the first eight lines must
- conform exactly to the following specifications.
-
- The first line of this file is the full drive and
- path to the BBS default directory. This is the
- directory where the BBS created the DOOR.SYS file.
- The second line is the name of the BBS. The third
- line is the IRQ for the port, and the fourth line
- is the Base Address for the port. If the sysop uses
- Com Ports other than 1 or 2, then he must enter the
- appropriate IRQ and BASE address so that GAPCDR can
- properly open the port. If Com ports 1 or 2 are
- used, then a 0 may be entered on both of these
- lines. The fifth line is the Communications Port
- Interface and must be either STANDARD, DIGIBOARD,
- or INT14/EBIOS. The sixth line is the DigiBoard
- Memory Window. The seventh line is the DigiBoard
- I/O Port Address. The eighth line is the DigiBoard
- Channel Number.
-
- It is the responsibility of the door author to
- describe the format of these eight lines to the end
- user. If your door program requires no
- configuration parameters of its own, you can simply
- distribute a sample configuration file with these
- eight lines already in it.
-
-
-
-
-
- Page 71
-
-
-
- GAP Communications GAPCDR
-
-
- GAPCDR will not close this file after reading the
- first four lines. It leaves the file open for the
- programmer's use. Remember that you assign a FILE
- pointer to the return value so that you may access
- the file. If your door does require certain
- configuration parameters, have your users place the
- parameters in the file starting with line 9. If you
- use a set up program, be sure that your set up
- program writes the first eight lines as specified.
-
- After you have called read_cnf and init_door, if
- you have any configuration options in the
- configuration file, you should use the stream input
- routines to read those options. Then fclose the
- file using the FILE pointer returned. Even if you
- have no options to read, you must close the file.
-
- WARNING : You must call this routine before using
- any of the GAPCDR functions. After calling this
- routine, you must call init_door.
-
- Return Value FILE pointer.
-
- Example
-
- FILE *fp; // File pointer
-
- fp = read_cnf("TOURIST.CNF"); // read cnf file
- fclose(fp); // close the file
- init_door(); // init the door
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 72
-
-
-
- GAP Communications GAPCDR
-
-
- read_doorsys
- -----------------------------------------------------------------
-
- Purpose Reads the DOOR.SYS universal door interface file.
-
- short read_doorsys(void);
-
- Type High Level
-
- Description Internal routine called by init_door. Reads the
- DOOR.SYS file and initializes any global variables
- that depend on the information in that file.
-
- Return Value 0 = no error, 1 = error.
-
- Example c = read_doorsys();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 73
-
-
-
- GAP Communications GAPCDR
-
-
- read_gapuser
- -----------------------------------------------------------------
-
- Purpose Reads the GAP Communications USERS.DAT file.
-
- short read_gapuser(char *path);
-
- path Full path and name of the USERS file
-
- Type High Level
-
- Description Reads the user record of the current user in the
- GAP USERS.DAT file. The record is read into a
- structure variable called gapuser. You must supply
- the path and name to the base part of the User
- file. GAP stores the name of the User file in the
- GAPBBS.CNF file (which you must read yourself).
- Read_gapuser will add the .DAT extension.
-
- Return Value 0 = no error, 1 = error.
-
- Example c = read_gapuser(userpath);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 74
-
-
-
- GAP Communications GAPCDR
-
-
- read_pcbsys
- -----------------------------------------------------------------
-
- Purpose Reads the PCBOARD.SYS file.
-
- short read_pcbsys(void);
-
- Type High Level
-
- Description Reads the PCBOARD.SYS system file. The record is
- read into a structure variable called pcbsys.
-
- Return Value 0 = no error, 1 = error.
-
- Example c = read_pcbsys();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 75
-
-
-
- GAP Communications GAPCDR
-
-
- read_pcbuser
- -----------------------------------------------------------------
-
- Purpose Reads the PCB USERS file.
-
- short read_pcbuser(char *path);
-
- path Full path and name of the USERS file
-
- Type High Level
-
- Description Reads the user record of the current user in the
- PCB USERS file. The record is read into a structure
- variable called pcbuser. You must supply the path
- and name to the User file. PCB stores the path\name
- of the User file in the PCBOARD.DAT file (which you
- must read yourself).
-
- Return Value 0 = no error, 1 = error.
-
- Example c = read_pcbuser(userpath);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 76
-
-
-
- GAP Communications GAPCDR
-
-
- read_score
- -----------------------------------------------------------------
-
- Purpose Reads the score file and displays the results.
-
- short read_score(char *datfile,char *message);
-
- datfile Path and name of data file to read
- message Message to display
-
- Type High Level
-
- Description This function will read the scoreboard data file
- for your door (if any) and display the results. You
- pass as parameters the name of the data file to
- read, and a message to display at the top of the
- scoreboard. The message could be something like
- "Top 10 Players".
-
- Return Value 0 = scores read, 1 = no scores to read.
-
- Example read_score("TOURIST.DAT","Top 10 Tourists");
-
- if (read_score("TOURIST.DAT","Top 10 Tourists"))
- {
- nl(1);
- ansi(BWHITE);
- show_mess("No one's made it Yet!",NO,YES);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 77
-
-
-
- GAP Communications GAPCDR
-
-
- reset_port
- -----------------------------------------------------------------
-
- Purpose Restores the Communications port.
-
- void reset_port(void);
-
- Type Low Level
-
- Description This function must be called prior to exiting the
- program. It restores the interrupt vector used by
- the communications routines. It is called
- internally by leave so it is not necessary for you
- to explicitly invoke it.
-
- Return Value None.
-
- Example reset_port(); // Restore communications port
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 78
-
-
-
- GAP Communications GAPCDR
-
-
- restore_screen
- -----------------------------------------------------------------
-
- Purpose Restores a previously saved portion of the screen.
-
- void restore_screen(short topr, short topc,
- short botr, short botc,
- unsigned short memseg);
-
- topr Top row of screen
- topc Top left column of screen
- botr Bottom row of screen
- botc Bottom right column of screen
- memseg Segment of buffer to save to
-
- Type Low Level
-
- Description This function allows you to restore a previously
- saved portion of the screen. You supply the top row
- and column and the bottom row and column co-
- ordinates of the rectangle. All co-ordinates are 0
- based. The memseg is the segment address of the
- buffer that a previous call to save_screen saved
- the video contents to.
-
- Return Value None.
-
- Example restore_screen(3,8,16,71,dseg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 79
-
-
-
- GAP Communications GAPCDR
-
-
- rest_cbreak
- -----------------------------------------------------------------
-
- Purpose Restores the Ctrl-Break vector.
-
- void rest_cbreak(void);
-
- Type Low Level
-
- Description This function must be called prior to exiting the
- program. It restores the interrupt vector used by
- the Ctrl-Break routine. It is called internally by
- leave so it is not necessary for you to explicitly
- invoke it.
-
- Return Value None.
-
- Example rest_cbreak(); // restore Ctrl-Break vector
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 80
-
-
-
- GAP Communications GAPCDR
-
-
- rest_int10
- -----------------------------------------------------------------
-
- Purpose Restores the interrupt 10 (BIOS) vector.
-
- void rest_int10(void);
-
- Type Low Level
-
- Description When setting up an interrupt 10 BIOS trap to
- protect a DOS Window, this function must be called
- when it is no longer necessary to protect a portion
- of the screen.
-
- Return Value None.
-
- Example See the example for set_cord.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 81
-
-
-
- GAP Communications GAPCDR
-
-
- rts
- -----------------------------------------------------------------
-
- Purpose Toggle the RTS line on and off.
-
- void rts(short how)
-
- how 0 = Turn RTS off.
- 1 = Turn RTS on
-
- Type Low Level
-
- Description This routine is used to turn the RTS line of the
- communications port on or off. Turning RTS off
- (providing the modem supports hardware handshaking)
- tells the modem to stop sending data to the
- computer. It is typically toggled off while writing
- a buffer of data to a disk.
-
- Return Value None.
-
- Example rts(0); // Turn RTS off
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 82
-
-
-
- GAP Communications GAPCDR
-
-
- rxempty
- -----------------------------------------------------------------
-
- Purpose To check if there are any characters in the receive
- buffer.
-
- short rxempty(void);
-
- Type Low Level
-
- Description This function checks the communications receive
- buffer to see if there are any characters waiting
- to be read.
-
- Return Value Returns 1 if buffer is empty, 0 if there are
- characters waiting to be read.
-
- Example
-
- while (rxempty()) // nothing happening
- dv_pause(); // give up time slice
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 83
-
-
-
- GAP Communications GAPCDR
-
-
- save_screen
- -----------------------------------------------------------------
-
- Purpose Saves a portion of the screen.
-
- void save_screen(short topr, short topc,
- short botr, short botc,
- unsigned short memseg);
-
- topr Top row of screen
- topc Top left column of screen
- botr Bottom row of screen
- botc Bottom right column of screen
- memseg Segment of buffer to save to
-
- Type Low Level
-
- Description This function allows you to save a rectangular
- portion of the screen. You supply the top row and
- column and the bottom row and column co-ordinates
- of the rectangle. All co-ordinates are 0 based. The
- memseg is the segment address of a buffer to save
- the video contents to and assumes your buffer was
- allocated by DOS (i.e., the offset portion of the
- buffer begins at 0).
-
- Return Value None.
-
- Example
-
- unsigned short dseg;
-
- dos_allocatemem(114,&dseg); // get some memory
- save_screen(3,8,16,71,dseg); // save contents of video
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 84
-
-
-
- GAP Communications GAPCDR
-
-
- setport
- -----------------------------------------------------------------
-
- Purpose Initialize the Communications Port.
-
- short set_port(short bufsize, short irq,
- short base);
-
- bufsize Size of Receive buffer
- irq Port IRQ to use
- base Port Base Address to use
-
- Type Low Level
-
- Description This is the port initialization routine that is
- called by init_com. Bufsize is the size of the
- receive buffer to set up. Set_port will allocate
- memory based upon this size. Typical values are
- from 1200 to 4096 bytes. Note that the bufsize
- argument is ignored when using the Borland
- compiler. This is because Borland does not provide
- a memory allocation routine that allocates memory
- in the near heap (irregardless of memory model).
- For Borland, the bufsize is fixed at 2048 bytes.
- IRQ is the Interrupt Request number to use for the
- port and Base Address is the address where the port
- is located. The Port number is a global variable
- that is set when reading DOOR.SYS. Ports start with
- 0, where 0 equals COM 1, 1 equals COM 2, etc. For
- COM 1 and COM 2, you may simply pass 0 as the IRQ
- and Base address since the defaults for these ports
- will be used.
-
- Return Value 0 = successful, 1 = error encountered.
-
- Example
-
- // set up the port with a buffer size of 2k, using COM 1
-
- port = 0;
-
- if (setport(2048, 0, 0))
- exit(1);
-
-
-
-
-
-
-
-
- Page 85
-
-
-
- GAP Communications GAPCDR
-
-
- set_attr
- -----------------------------------------------------------------
-
- Purpose Sets the video color attributes.
-
- void set_attr(unsigned char forg, unsigned char
- back);
-
- forg Foreground Color (0-15)
- back Background Color (0-7)
-
- Type Low Level
-
- Description This function is used just prior to invoking a DOS
- Window so that the window colors can be set.
-
- Return Value None.
-
- Example See the example for set_cord.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 86
-
-
-
- GAP Communications GAPCDR
-
-
- set_cbreak
- -----------------------------------------------------------------
-
- Purpose Initializes the Ctrl-Break vector.
-
- void set_cbreak(void);
-
- Type Low Level
-
- Description To trap Ctrl-C and Ctrl-Break, this function should
- be called to set up an interrupt service routine to
- trap these two keys. It is imperitive that the
- program not exit before calling rest_cbreak so that
- the interrupt vector can be restored. Leave does
- this for you automatically.
-
- Return Value None.
-
- Example set_cbreak(); // set up Ctrl-Break ISR
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 87
-
-
-
- GAP Communications GAPCDR
-
-
- set_cord
- -----------------------------------------------------------------
-
- Purpose Set up a DOS Window.
-
- void set_cord(unsigned char topr,
- unsigned char topc,
- unsigned char botr,
- unsigned char botc);
-
- topr Top left row
- topc Top left column
- botr Bottom row
- botc Bottom right column
-
- Type Low Level
-
- Description This function sets the window co-ordinates for a
- DOS Window. Using this function in combination with
- set_int10 allows you to set up a window into which
- all local screen output will be directed. Topr and
- topc are the top left corner of the window and botr
- and botc are the bottom right corner of the window.
- All co-ordinates are 0 based.
-
- Return Value None.
-
- Example
-
- _dos_allocmem(114,&dseg); // get some memory
- save_screen(3,8,16,71,dseg); // save a part of screen
- set_int10(); // set up BIOS trap
- set_cord(4,9,15,70); // tell it what to protect
- set_attr(14,1); // Yellow on Blue
- cls_all(); // clear the window
- system("COMMAND"); // go to DOS
- rest_int10(); // restore vector
- restore_screen(3,8,16,71,dseg); // restore screen
- _dos_freemem(dseg); // free memory
-
-
-
-
-
-
-
-
-
-
-
-
- Page 88
-
-
-
- GAP Communications GAPCDR
-
-
- set_int10
- -----------------------------------------------------------------
-
- Purpose Set up an interrupt 10 (BIOS) trapper.
-
- void set_int10(void);
-
- Type Low Level
-
- Description This function intercepts the Interrupt 10 vector so
- that it can trap calls to the BIOS video output
- routines. It is used in conjunction with set_cord
- to set up a portion of the screen into which all
- video output through the BIOS will be directed. If
- a console driver other than CON or ANSI.SYS is used
- that writes directly to the screen, this function
- will not work.
-
- Return Value None.
-
- Example See the example for set_cord.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 89
-
-
-
- GAP Communications GAPCDR
-
-
- set_status
- -----------------------------------------------------------------
-
- Purpose Displays and updates the sysop status line.
-
- void set_status(short how);
-
- how 0 = set the status line
- 1 = update the status line
- 4 = show other user stats
-
-
- Type High Level
-
- Description Displays or updates the sysop status line.
-
- Return Value None.
-
- Example set_status(0); // display status line
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 90
-
-
-
- GAP Communications GAPCDR
-
-
- show_file
- -----------------------------------------------------------------
-
- Purpose Displays a text file.
-
- void show_file(char *filename);
-
- filename Full path and name of file to display
-
- Type High Level
-
- Description Many door programs have welcome, news, exit, help
- and other files to show to the user at various
- points in the program. This is the function that
- allows you to do that. To display a file to the
- user, call the function with the full
- drive\path\filename of the file to display.
-
- If you have color and non-color versions of files
- pass the name of the non-color version as this
- function will automatically append a "G" to the
- filename if the user is in color mode. In fact,
- this function will always try to find a file with a
- "G" appended to the end of the name (if the user is
- in color mode) before it looks for the actual file
- by the name you specified. If you pass "WELCOMEG"
- to this function and the user is in color mode, it
- will first try to find a file with the name of
- "WELCOMEGG".
-
- Pressing CTRL-K or CTRL-X will abort any file
- display.
-
- REMEMBER : If you have both color and non-color
- versions of the same files, pass the name of the
- non-color version. Also, the actual disk files must
- be named in such a way that they have no file
- extension and the color version ends with a "G".
-
- Return Value None.
-
- Example show_file("WELCOME"); // display welcome file
-
-
-
-
-
-
-
-
-
- Page 91
-
-
-
- GAP Communications GAPCDR
-
-
- show_mess
- -----------------------------------------------------------------
-
- Purpose Displays a message.
-
- void show_mess(char *message,short bell,
- short newline);
-
- message Message to display.
- bell YES or NO to ring the bell.
- newline YES or NO to issue a CR/LF after
- message.
-
- Type High Level
-
- Description This is the main string output function for GAPCDR.
- Under most circumstances, this is the only function
- that you would call to display output to the user.
-
- Return Value None
-
- Example show_mess("This is a message!",NO,YES);
-
- // the first show_mess displays the string and leaves the
- // cursor on the same line. The second displays the
- // string, rings the remote user's bell, and drops the
- // cursor to the next line.
-
- nl(1);
- show_mess("Are you ready? (Y/N) : ",NO,NO);
-
- empty(response,3);
- get_string(response);
-
- if (response[0] == 'Y')
- // begin whatever it is you want to begin
- else
- show_mess("Too Bad!",YES,YES);
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 92
-
-
-
- GAP Communications GAPCDR
-
-
- timer
- -----------------------------------------------------------------
-
- Purpose Pauses for the number of "ticks" specified.
-
- void timer(short ticks);
-
- ticks Number of timer ticks to pause.
-
- Type High Level
-
- Description This function allows you to pause all processing
- for the specified number of ticks. It is in-
- sensitive to processor speed.
-
- The function simply delays the number of "ticks"
- indicated by the passed parameter. Each tick is
- 1/18 of a second (or 55 miliseconds).
-
- Return Value None.
-
- Example timer(18); // pause for 1 second
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 93
-
-
-
- GAP Communications GAPCDR
-
-
- time_credit
- -----------------------------------------------------------------
-
- Purpose Issues timecredits to user.
-
- void time_credit(short flag);
-
- flag 1 = start timer
- 0 = end timer
-
-
- Type High Level
-
- Description This is basically an internal routine called by
- chat and sysop shell to DOS so that the user is not
- penalized for time used. It updates a global
- variable called timecredit. Timecredit is used in
- the calculations that determine the user's time
- remaining.
-
- If you wish to use this feature in your own rou-
- tines, prior to entering your routine, call
- time_credit with a 1 and it will start the timer.
- When your routine is finished, call time_credit
- with a 0 and the timer will stop. The variable
- timecredit will be updated with the elapsed time.
-
- Return Value None.
-
- Example time_credit(1); // start the timer
-
- time_credit(1); // start the timer
- do_chat(); // chat with user
- time_credit(0); // stop the timer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 94
-
-
-
- GAP Communications GAPCDR
-
-
- time_left
- -----------------------------------------------------------------
-
- Purpose To compute the user's time remaining.
-
- void time_left(void);
-
- Type High Level
-
- Description This is the function that is called by the input
- and output routines to compute the user's time
- remaining. It is not necessary for the programmer
- to call this routine directly.
-
- A global variable called timeleft will be updated
- with each call. This variable may be used in
- prompts that display the user's remaining time.
-
- As long as all input/output is performed thru calls
- to the GAPCDR library, the timeleft variable will
- always be current.
-
- Return Value None.
-
- Example time_left(); // calculate time remaining
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 95
-
-
-
- GAP Communications GAPCDR
-
-
- trim
- -----------------------------------------------------------------
-
- Purpose Trims spaces from the end of NULL terminated
- strings.
-
- char *trim(char *string);
-
- string String containing trailing spaces
-
- Type High Level
-
- Description This function will remove any spaces from the end
- of a string. It modifies the passed string.
-
- Return Value Pointer to the string without the spaces.
-
- Example trim(username); // get rid of spaces
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 96
-
-
-
- GAP Communications GAPCDR
-
-
- update_clock
- -----------------------------------------------------------------
-
- Purpose Updates the status line clock.
-
- void update_clock(void);
-
- Type High Level
-
- Description Internal routine to update the status line clock.
-
- Return Value None.
-
- Example
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 97
-
-
-
- GAP Communications GAPCDR
-
-
- wrap_word
- -----------------------------------------------------------------
-
- Purpose To wrap a word during sysop chats.
-
- void wrap_word(void);
-
- Type Low Level
-
- Description Internal function called by putkey to wrap words.
-
- Return Value None.
-
- Example
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 98
-
-
-
- GAP Communications GAPCDR
-
-
- write_gapuser
- -----------------------------------------------------------------
-
- Purpose Updates the user record in GAP's USERS.DAT file.
-
- short write_gapuser(char *path);
-
- path Full path and name of Users File
-
- Type High Level
-
- Description This function allows you to update any variables in
- the GAP USERS.DAT file for the current user. You
- must first read the user record before you can
- write to it.
-
- You must pass the path and name of the Users file.
- The name is obtained by reading GAPBBS.CNF.
- Write_gapuser will add the .DAT extension.
-
- WARNING : The GAP USERS.DAT file contains strings
- that are fully padded with spaces. If you modify
- any of these strings, you MUST make sure that the
- string is fully padded with spaces and that the
- NULL character is placed in the last string posi-
- tion.
-
- WARNING : The indexes for the user file consists of
- the user's last name and first name, user's level,
- and user's handle. Do not under any circumstances
- modify either of these four fields. Doing so will
- cause corruption of the Index file.
-
- Return Value 0 = no error, 1 = error.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 99
-
-
-
- GAP Communications GAPCDR
-
-
- Example c = write_gapuser(userpath);
-
- // allow user to change city and state
-
- c = read_gapuser(userpath);
-
- if (c == 0)
- {
- show_mess("Enter City/State : ",NO,NO);
-
- empty(city,29); // clear string
- get_string(city); // get response
-
- if (city[0] != 0) // if something entered
- {
- strcpy(user.city,city); // copy it
- pad(user.city,29); // pad it with spaces
- c = write_gapuser(userpath); // update user record
-
- if (c == 0)
- show_mess("Saved new City",NO,YES);
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 100
-
-
-
- GAP Communications GAPCDR
-
-
- write_pcbsys
- -----------------------------------------------------------------
-
- Purpose Updates the PCBOARD.SYS file.
-
- short write_pcbsys(void);
-
- Type High Level
-
- Description This function allows the programmer to update the
- PCBOARD.SYS File. You must first read the file
- before you write to it and you should not use this
- function unless you know that your program is
- running with PCB as the host system.
-
- Return Value 0 = no error, 1 = error.
-
- Example c = write_pcbsys() // write the file
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 101
-
-
-
- GAP Communications GAPCDR
-
-
- write_pcbuser
- -----------------------------------------------------------------
-
- Purpose Updates the PCB USERS file.
-
- short write_pcbuser(char *path);
-
- path Full path and name to the Users file
-
- Type High Level
-
- Description This function allows the programmer to update the
- PCB USERS File. Do not use unless you know your
- program is running under a PCB host system. You
- must first read the user record before you can
- write to it.
-
- You must pass the path and name of the Users file.
- The name is obtained by reading PCBOARD.DAT.
-
- Return Value 0 = no error, 1 = error.
-
- Example c = write_pcbuser(); // write the file
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 102
-
-
-
- GAP Communications GAPCDR
-
-
- write_score
- -----------------------------------------------------------------
-
- Purpose Creates and maintains a scoreboard.
-
- void write_score(char *filename,long score);
-
- filename Path and name of data file to write to
- score Score to write
-
- Type High Level
-
- Description This function will create and maintain a scoreboard
- of the top ten players. You pass it two parameters.
- The first is a string containing the name of the
- data file to create/maintain. The second is a long
- unsigned integer containing the score to write. The
- user's name and the current date are already known.
- If the sysop is in the door at the time, the
- function will simply return and not write a score.
- The scores will automatically be sorted in
- decreasing order by the highest score. If you wish
- to use this routine but your points are kept as
- shorts instead of longs, simply cast the second
- parameter to an unsigned long.
-
- Return Value None.
-
- Example
-
- short points;
-
- points = 1000;
- write_score("TOURIST.DAT,(unsigned long) points);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 103
-
-
-
- GAP Communications GAPCDR
-
-
- Index
-
-
- Access1 27, 29
- Alarm 23
- Ansi 27, 30
- Ansi driver
- color 7, 49, 51, 64
- external 18, 20
- initializing 11, 58
- internal 7, 12, 49
- ANSI variables 8, 22
- Anystring 26
- Backspace 26, 27, 31
- Base address 9, 15, 25, 71, 85
- Base_add 25, 71, 85
- Batch file 16
- Baud 18, 19, 20, 23, 61
- Baud rate 6, 18, 19, 20, 23, 61, 85
- BBS
- default directory 26, 71
- name 26
- system files 14, 26, 74, 75, 76, 99, 101, 102
- Bbs_dir 26, 71
- Bell 23, 92
- Birthday 26
- Board_name 26
- Bphone 24
- BS 26
- Business phone number 24
- Caller alarm 23
- Caller's birth date 26
- Carriage return 26
- Carrier 18, 19, 62, 67
- Characters
- sending to com port 27, 40
- sending to local & remote 27, 50
- sending to local screen 27, 64
- Chat 17, 25, 43, 70
- Chatting with user 25
- City 24
- Ckeypress 27, 32
- Clear_scrn 27, 33
- Clockon 25, 97
- Clr_buf 27, 34
- Cls 27, 33, 35
- Cls_all 27, 36
- Color 7, 20, 23, 25, 30, 49, 51, 54, 64, 86
-
-
-
- Page 104
-
-
-
- GAP Communications GAPCDR
-
-
- Column 25
- Comgetc 20, 27, 37
- Comgetd 20, 27, 38
- Communications
- advanced applications 18
- base address 9, 15, 25, 71, 85
- baud rates 6, 18, 19, 20, 23, 85
- carrier 18, 19, 62, 67
- configuration file 9
- DTR 20
- FIFO buffers 6
- Functions
- clr_buf 27, 34
- comgetc 27, 37
- comgetd 27, 38
- computb 27, 39
- computc 27, 40
- computs 27, 41
- dtr 27, 44
- init_port 19, 20, 27, 61
- iscd 27, 62
- no_carrier 27, 67
- reset_port 19, 28, 78
- rts 28, 82
- rxempty 28, 83
- setport 19, 28, 85
- initializing 19, 59, 60, 61, 85
- input 20, 37, 38, 83
- interrupt 11, 19, 63, 78
- IRQ 9, 15, 25, 71, 85
- output 20, 39, 40, 41
- port 11, 12, 18, 23, 71, 85
- Compilers
- compiling & linking 12
- cputs 12
- floating point 8, 13, 55
- function calling 13
- goto 13
- header files 8, 53
- printf 12
- supported 8
- Compiling 12
- Computb 27, 39
- Computc 20, 27, 40
- Computs 20, 27, 41
- Configuration file 9, 11, 15, 16, 71
- format 9, 15
- Control characters 8
-
-
-
- Page 105
-
-
-
- GAP Communications GAPCDR
-
-
- editor 8
- Cputs 12
- CRLF 26, 51
- Ctrl-Break handler 11, 80, 87
- Curbytes 24
- Curfiles 23
- Current display color 25
- Current download bytes 24
- Current files downloaded 23
- Current time 25
- Cursoff 27, 42
- Curson 27, 42
- Cursor 27, 42
- Curtime 26
- Date user's subscription expires 24
- Default color 23
- Delaying 93
- DESQview 19, 27, 32, 38, 45, 46, 47
- Dflt_color 23
- Display clock 25
- Display color 25
- Distribution files 7
- Do_chat 27, 43
- DOOR.SYS 7, 9, 12, 14, 26, 73
- Universal format 7
- Variables 23
- Doors 16
- Doors opened 24
- Doors_opened 24
- DOS shell 17, 20
- DOS Window 20, 54, 79, 81, 84, 86, 88, 89
- Downbytes 24
- Download bytes 24
- Downloads 24
- DSZ 20
- DTR 20, 27, 44
- Dv_here 19, 27, 45
- Dv_pause 18, 27, 32, 46, 47
- Editor 8
- control characters 8
- Elap_time 27, 47
- Empty 27, 48, 56
- Endview 25
- Event_time 24
- Expert 23
- Files
- checking for existence of 27, 29
- configuration 9, 15
-
-
-
- Page 106
-
-
-
- GAP Communications GAPCDR
-
-
- displaying 25, 91
- DOOR.SYS 7, 9, 14
- GAPCDR.H 8, 11
- GAPSTRUC.H 8
- PCBOARD.SYS 14
- First name 24
- Fix_color 27, 49
- Flag 25
- Floating point 8, 13, 55
- Fname 24
- Full name 24
- Function calling 13
- Function keys 17
- Functions
- access1 27, 29
- ansi 30
- backspace 31
- ckeypress 32
- clear_scrn 33
- clr_buf 34
- cls 33, 35
- cls_all 36
- comgetc 20, 37
- comgetd 20, 38
- computb 39
- computc 20, 40
- computs 20, 41
- cursoff 42
- curson 42
- do_chat 43
- DOS Window 20
- dtr 44
- dv_here 19, 45
- dv_pause 18, 46
- elap_time 47
- empty 48, 56
- fix_color 49
- gapputc 50
- gapputs 51
- get_attr 20, 54
- get_random 55
- get_string 48, 56
- getakey 52
- getkeyc 53
- init_ansi 58
- init_com 59
- init_door 10, 11, 60
- init_port 19, 20, 61
-
-
-
- Page 107
-
-
-
- GAP Communications GAPCDR
-
-
- iscd 62
- leave 11, 12, 63
- lputc 64
- lputs 64
- more 65
- nl 66
- no_carrier 18, 67
- pagesysop 68
- pause 69
- putkey 70
- read_cnf 9, 10, 11, 71
- read_doorsys 73
- read_gapuser 12, 74
- read_pcbsys 12, 75
- read_pcbuser 76
- read_score 77
- reset_port 19, 78
- rest_cbreak 80
- rest_int10 81
- restore_screen 79
- rts 82
- rxempty 83
- save_screen 84
- set_attr 86
- set_cbreak 87
- set_cord 88
- set_int10 89
- set_port 19
- set_status 90
- setport 85
- show_file 91
- show_mess 51, 92
- time_credit 94
- time_left 95
- timer 18, 93
- trim 96
- update_clock 97
- wrap_word 98
- write_gapuser 99
- write_pcbsys 101
- write_pcbuser 102
- write_score 103
- GAPCDR.H 11
- Gapputc 27, 50
- Gapputs 27, 51
- GAPSTRUC.H 8, 53
- Gendir 26
- Get_attr 20, 27, 54
-
-
-
- Page 108
-
-
-
- GAP Communications GAPCDR
-
-
- Get_random 27, 55
- Get_string 27, 48, 56
- Getakey 27, 52
- Getkeyc 27, 53
- Gotdv 18
- Goto 13
- Handle 24
- Header files
- GAPCDR.H 8, 11
- GAPSTRUC.H 8, 53
- Home phone number 24
- Hphone 24
- Init_ansi 27, 58
- Init_com 27, 59
- Init_door 10, 11, 27, 60
- Init_port 19, 20, 27, 61
- Initializing
- ANSI driver 11, 49, 58
- interrupt handlers 11, 85
- program 11, 54, 58, 59, 60, 71, 73, 85, 87
- strings 27, 48, 56
- Input
- from com port 20, 27, 37, 38, 83
- from local & remote 27, 32, 46, 52, 56
- from local keyboard 27, 53
- Instatus 25
- Interrupt handlers
- BIOS 81, 89
- communications 19, 63, 78
- CTRL-Break 11, 63, 80, 87
- IRQ 9, 15, 25, 71, 85
- Iscd 27, 62
- Keyboard 32, 46, 52, 53, 56
- timeout 32, 56
- Last date user was on 24
- Last name 24
- Last new files scan 24
- Last_new 24
- Lastdate 24
- Leave 11, 12, 27, 63
- Level 23
- Line feed 26
- Lines 25, 65, 66
- Linking 12
- Lname 24
- Local 18, 23
- Functions
- cls 27, 35
-
-
-
- Page 109
-
-
-
- GAP Communications GAPCDR
-
-
- cls_all 27, 36
- cursoff 27, 42
- curson 27, 42
- getkeyc 27, 53
- lputc 27, 64
- lputs 27, 64
- Local mode 12, 18
- Lowercase characters 25, 56
- Lputc 27, 64
- Lputs 27, 64
- Maindir 26
- Make_sound 27
- Maxbytes 24
- Maxfiles 23
- Maximum bytes available 24
- Maximum files available 23
- Mesleft 24
- Messages left 24
- Minsleft 23
- Minutes left at door start 23
- More prompt 25, 27, 65
- Multi 12, 23
- Multi user 12, 17, 29
- Name of the BBS 26
- NL 27, 66, 92
- No clock 25
- No_carrier 18, 19, 27, 67
- Node 23
- Node number 23
- Non Stop mode 25
- Normal 25
- Noup 25, 56
- Novice 23
- NS 25, 65
- Number of downloads 24
- Number of times on 24
- Output
- to com port 20, 27, 39, 40, 41
- to local & remote 27, 28, 50, 51, 92
- to local screen 27, 64
- Page 23
- Page bell 17, 23, 68
- Page length 23, 65
- Pagesysop 27, 68
- Parity 23
- Pascal
- function calling 13
- Password 24
-
-
-
- Page 110
-
-
-
- GAP Communications GAPCDR
-
-
- Path to DOOR.SYS 26
- Pause 27, 69
- Pausing 93
- PCBOARD.SYS 14
- PKUNZIP 20
- Port 18, 19, 23, 71, 85
- Printer 23
- Printf 12
- Prompts
- more 65
- pause 69
- Putkey 27, 70
- Random number generator 11, 27, 55
- Read_cnf 9, 10, 11, 27, 71
- Read_doorsys 28, 73
- Read_gapuser 12, 28, 74
- Read_pcbsys 12, 28, 75
- Read_pcbuser 28, 76
- Read_score 28, 77
- Realcredit 23
- Receive buffer 32, 34, 37, 38, 83, 85
- Recnum 24
- Redisplay 25
- Remote user 23
- Remote user's bps rate 23
- Reset_port 19, 28, 78
- Rest_cbreak 28, 80
- Rest_int10 28, 81
- Restore_screen 28, 79
- Rts 28, 82
- Rxempty 28, 83
- Save_screen 28, 84
- Scan codes 53
- Scoreboard 77, 103
- Screen 23, 79, 84
- clearing 33, 35, 36
- color 54, 64, 86
- cursor 42
- full 65
- Set_attr 28, 86
- Set_cbreak 28, 87
- Set_cord 28, 88
- Set_int10 28, 89
- Set_status 28, 90
- Setport 19, 28, 85
- Shell to DOS 17
- Show_file 28, 91
- Show_mess 28, 51, 92
-
-
-
- Page 111
-
-
-
- GAP Communications GAPCDR
-
-
- Single user 12, 23
- Starttime 25
- Status line
- displaying 17, 25, 90
- protected 17
- Strings
- initializing 27, 48, 56
- receiving from local & remote 27, 48, 56
- removing spaces from 96
- sending to com port 27, 41
- sending to local & remote 27, 51, 92
- sending to local screen 27, 64
- Strtime 26
- Structures 26
- Subscrip 24
- Sysname 26
- Sysop
- batch file 16
- function keys 17
- functions 14, 17
- setup 14
- Sysop's name 26
- System files 14, 74, 75, 76, 99, 101, 102
- Temptime 25
- Time 25
- Time credits 23, 94
- Time door opened 25
- Time slice 18, 32, 38, 45, 46, 47
- Time user has left 25, 47, 52, 95
- Time_credit 28, 94
- Time_left 28, 95
- Timecredit 14, 25
- Timeleft 25, 32, 52, 95
- Timenow 25
- Timeout 32
- Timer 18, 28, 93
- Timeson 24
- Total uploads 24
- Trim 28, 96
- Twit 17
- Upbytes 24
- Update_clock 28, 97
- Updating status line 25
- Upload bytes 24
- Uploads 24
- Uppercase characters 25, 56
- Usemore1 25
- User Record 26
-
-
-
- Page 112
-
-
-
- GAP Communications GAPCDR
-
-
- User's birth date 26
- User's business phone 24
- User's first name 24
- User's full name 24
- User's Handle 24
- User's home phone 24
- User's home town 24
- User's last name 24
- User's password 24
- User's record number 24
- User's security level 23
- Userbaud 23
- Username 24
- Variables
- ANSI 8, 22
- Defines
- NO 22
- YES 22
- DOOR.SYS
- alarm 23
- baud 18, 23
- bell 23
- bphone 24
- city 24
- color 23
- curbytes 24
- curfiles 23
- dflt_color 23
- doors_open 24
- downbytes 24
- downloads 24
- event_time 24
- expert 23
- fname 24
- handle 24
- hphone 24
- last_new 24
- lastdate 24
- level 23
- lname 24
- local 18, 23
- maxbytes 24
- maxfiles 23
- mesleft 24
- minsleft 23
- multi 12, 23
- node 23
- page 23
-
-
-
- Page 113
-
-
-
- GAP Communications GAPCDR
-
-
- parity 23
- password 24
- port 18, 19, 23
- printer 23
- realcredit 23
- recnum 24
- screen 23
- subscrip 24
- timeson 24
- upbytes 24
- uploads 24
- userbaud 23
- username 24
- Global
- anystring 26
- base_add 25
- bbs_dir 26
- birthday 26
- board_name 26
- BS 26
- chat 25
- clockon 25
- column 25
- CRLF 26, 51
- curtime 26
- endview 25
- flag 25
- gendir 26
- gotdv 18
- instatus 25
- IRQ 25
- lines 25
- maindir 26
- normal 25
- noup 25, 56
- NS 25
- redisplay 25
- starttime 25
- strtime 26
- sysname 26
- temptime 25
- timecredit 14, 25
- timeleft 25
- timenow 25
- usemore1 25
- view 25
- wordwrap 25
- Structures
-
-
-
- Page 114
-
-
-
- GAP Communications GAPCDR
-
-
- pcbsys 26
- pcbuser 26
- user 26
- View 25
- Window 20, 79, 81, 84, 86, 88, 89
- Wordwrap 25, 70, 98
- Wrap_word 28, 98
- Write_gapuser 28, 99
- Write_pcbsys 28, 101
- Write_pcbuser 28, 102
- Write_score 28, 103
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 115